// название
private int
imageRes
;
// картинка
public
Image
(
String
name,
int
image){
this
.
name
=name;
this
.
imageRes
=image;
}
public
String
getName
() {
return this
.
name
;
}
public void
setName
(
String
name) {
this
.
name
= name;
}
public int
getImageResource
() {
return this
.
imageRes
;
}
public void
setImageResource
(
int
flagResource) {
this
.
imageRes
= flagResource;
}
}
Второй класс назовём CustomRecyclerAdapter, он нужен для того,
чтобы определить свой кастомный адаптер для RecyclerView, и чтобы в итоге
связывать нужные данные и отображать список.
43
public class
CustomRecyclerAdapter
extends
RecyclerView
.
Adapter
<
CustomRecyclerAdapter
.
ViewHolder
>{
private final
LayoutInflater
inflater
;
private final
List
<
Image
>
images
;
CustomRecyclerAdapter
(
Context
context,
List
<
Image
> images) {
this
.
images
= images;
this
.
inflater
=
LayoutInflater
. from(context);
}
public void
onBindViewHolder
(
CustomRecyclerAdapter
.
ViewHolder
holder,
int
position) {
Image image
=
images
.get(position);
holder.
text
.setText(
image
.getName());
holder.
image
.setImageResource(
image
.getImageResource());
}
@NonNull
@Override
public
CustomRecyclerAdapter
.
ViewHolder
onCreateViewHolder
(
@NonNull
ViewGroup
parent,
int
viewType) {
View view
=
inflater
.inflate(
R
.
layout
.
list_item
, parent,
false
);
return new
ViewHolder(
view
);
}
@Override
public int
getItemCount
() {
return
images
.size();
}
public class
ViewHolder
extends
RecyclerView
.
ViewHolder
{
final
ImageView
image
;
final
TextView
text
;
ViewHolder
(
View
view){
super
(view);
image
= view.findViewById(
R
.
id
.
imageView
);
text
= view.findViewById(
R
.
id
.
textView
);
}
}
}
И теперь, когда у нас есть всё необходимое, в MainActivity.java
достаточно добавить код, наполняющий с помощью кастомного адаптера
список RecyclerView. Данные добавляются в методе setData():
public class
MainActivity
extends
AppCompatActivity
{
ArrayList
<
Image
>
images
=
new
ArrayList<
Image
>();
@Override
protected void
onCreate
(
Bundle
savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(
R
.
layout
.
activity_main
);
44
setData();
RecyclerView recyclerView
= findViewById(
R
.
id
.
review1
);
CustomRecyclerAdapter adapter
=
new
CustomRecyclerAdapter(
this
,
images
);
recyclerView
.setAdapter(
adapter
);
}
private void
setData
(){
images
.add(
new
Image (
"cat1"
,
R
.
drawable
.
image1
));
images
.add(
new
Image (
"cat2"
,
R
.
drawable
.
image2
));
images
.add(
new
Image (
"mycat"
,
R
.
drawable
.
image3
));
images
.add(
new
Image (
"nyancat"
,
R
.
drawable
.
image4
));
}
}
Таким образом, получим тот же список из котов, но теперь он
пролистывается вниз, каждый кот расположен на отдельной странице, и
список можно значительно расширить.
45
Лабораторная работа №6. Работа с анимацией
Задание:
создать
приложение,
содержащее
анимированные
интерфейсные элементы (например, увеличивающиеся при клике на них
кнопки, вращающиеся TextView и т.д.).
Самым простым видом анимации является покадровая анимация, когда
картинки (кадры) сменяют друг друга, создавая эффект движения или
изменения изображения. Это слишком простой, но утомительный процесс,
поэтому рассмотрим анимацию другого типа, так называемую tween-
анимацию. Создайте новое приложение с Empty Activity, перейдите в файл
activity_main.xml, удалите текстовое поле и поместите в центр экрана кнопку,
а внизу – как обычно, текстовое поле с ФИО. Затем необходимо создать
новый xml-файл для описания анимации. Для этого нажмите правой кнопкой
мыши по папке res и создайте новый файл Android resource с параметрами,
которые изображены на рисунке 27.
Рисунок 27 – Создание файла анимации
46
После данных действий в папке res появится новая папка anim с
файлом tween_anim.xml внутри. Переходим в этот файл и добавляем
следующий код внутрь тэга set:
<
scale
android
:fromXScale=
"2.0"
android
:toXScale=
"0.5"
android
:fromYScale=
"2.0"
android
:toYScale=
"0.5"
android
:pivotX=
:duration=_"2000"_/>_Здесь_описывается_уменьшение_объекта_с_длительность_анимации_в_2_секунды_(_android'>"50%"
android
:pivotY=
"50%"
android
:duration=
"2000"
/>
Здесь описывается уменьшение объекта с длительность анимации в 2
секунды (
android
:duration
). Так как анимация будет отображаться на
кнопке, нужно будет вернуть её в исходный размер, для этого добавляем ещё
немного кода:
<
scale
android
:fromXScale=
"0.5"
android
:toXScale=
"2.0"
android
:fromYScale=
"0.5"
android
:toYScale=
"2.0"
android
:pivotX=
"50%"
android
:pivotY=
"50%"
android
:duration=
"2000"
android
:startOffset=
"2000"
/>
Теперь кнопка сможет обратно увеличиться до своих размеров,
анимация увеличения также будет длиться 2 секунды, но она будет
отрабатывать не сразу, а с задержкой в 2 секунды (
android
:startOffset
).
То есть сначала идёт анимация уменьшения объекта, а затем анимация
увеличения. Ну и в заключение добавим анимацию вращения кнопки:
<
rotate
android
:pivotX=
"50%"
android
:pivotY=
"50%"
android
:fromDegrees=
"0"
android
:toDegrees=
"360"
47
android
:duration=
"2000"
android
:startOffset=
"4000"
/>
Анимация вращения будет ждать 4 секунды (пока отработают первые
две анимации), а затем за 2 секунды провернёт кнопку на 360 градусов по
часовой стрелке.
Ещё одним важным свойством анимации является параметр
interpolator. Интерполятор позволяет ускорить или замедлить выполнение
анимации на устройстве, а также добавить некоторые эффекты. Добавим
следующий код в конец открывающего тэга set:
android
:interpolator=
"@android:anim/bounce_interpolator"
Набрав
@android:anim
в кавычках, можно увидеть, какие типы
интерполяторов бывают, см. рисунок 28. Можно поэкспериментировать с
разными типами интерполяторов.
Рисунок 28 – Варианты интерполяторов
48
Итак, в нашем случае открывающий тэг set должен выглядеть
следующим образом:
<
set
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:interpolator=
"@android:anim/bounce_interpolator"
>
С описанием анимации закончили, теперь необходимо перейти в файл
MainActivity.java и выполнить анимацию после нажатия на кнопку. Для этого
в методе onCreate создаём ссылку на кнопку:
final
Button button = findViewById(R.id.
button
);
И создаём для неё listener и onClick. В onClick добавляем анимацию:
Animation animation =
AnimationUtils. loadAnimation(MainActivity.
this
,
R.anim.
tween_anim
);
button
.startAnimation(animation);
Импортируем все зависимости и исправляем ошибки, после чего
запускаем проект на эмуляторе. Теперь необходимо изменить параметры в
файле tween_anim.xml на собственные, чтобы все не сдавали одну и ту же
анимацию. Поэкспериментируйте с различными параметрами, можете также
производить анимацию не с кнопкой, а с каким-нибудь другим элементом.
Результат выполнения работы показан на рисунке 29.
49
Рисунок 29 – Результат анимации
50
Лабораторная работа №7. Работа с картами
Задание: создать приложение, отображающее после запуска карты
Google или какие-нибудь другие карты.
Создайте новый проект, но на этот раз выберите Google Maps Activity
вместо Empty Activity. Для того, чтобы пользоваться картами Google,
необходимо получить персональный ключ для приложения. Переходим в
файл res/values/google_maps_api.xml (открывается по умолчанию), и в
комментариях видим инструкцию на английском языке о том, как получить
ключ для приложения. Если коротко, то необходимо перейти по
персональной ссылке из комментария, залогиниться в свой Google аккаунт,
нажать кнопку Continue и затем Create API key, после чего перед вами
появится окно API key created с ключом, начинающимся на "AIza". Копируем
значение ключа из поля и вставляем в файл res/values/google_maps_api.xml
вместо фразы YOUR_KEY_HERE.
Теперь переходим в файл MapsActivity.java, и в самом последнем
методе onMapReady добавляем следующее в начало, после строки
Достарыңызбен бөлісу: |