Android控件七:视图-图片-文字切换器ViewAnimator
转载:https://www.cnblogs.com/lonelyxmas/p/7494731.html
https://blog.csdn.net/w57685321/article/details/78369761
ViewAnimator组件概述
ViewAnimator是一个基类,它继承了 FrameLayout,因此它表现出FrameLayout的特征,可以将多个View组件叠在一起。 ViewAnimator额外增加的功能可以在View切换时表现出动画效果。
ViewAnimator及其子类也是一组非常重要的UI组件,这种组件的主要功能是增加动画效果,从而使界面更加炫。使用ViewAnimator 时可以指定如下常见XML属性。
android:animateFirstView:设置ViewAnimator显示第一个View组件时是否使用动画。
android:inAnimation: 设置ViewAnimator显示组件时所使用的动画。
android:outAnimation: 设置ViewAnimator隐藏组件时所使用的动画。
相关子类
1,ViewSwitcher使用
ViewSwitcher代表了视图切换组件,它本身继承了 FrameLayout,因此可以将多个View 层叠在一起,每次只显示一个组件。当程序控制从一个View切换到另一个View时, ViewSwitcher支持指定动画效果。
为了给ViewSwitcher添加多个组件,一般通过调用ViewSwitcher的setFactory (ViewSwitcherViewFactory)方法为之设置 ViewFactory,并由该 ViewFactory 为之创建 View 即可。
效果图:
实现过程:
1 在xml布局文件中添加ViewSwitcher组件,和Button按钮,以控制翻页。
activity_test1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ViewSwitcher
android:id="@+id/viewSwitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ViewSwitcher>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="next"
android:text="下一个"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="prev"
android:text="上一个"/>
</LinearLayout>
</LinearLayout>
2 创建一个布局文件,给ViewSwitcher中每一个View设置的布局。(item)
slideimage2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/slideimg">
</ImageView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="我是图片"
android:textSize="20sp"
android:id="@+id/slidetx">
</TextView>
</LinearLayout>
3 获取到ViewSwitcher组件,并初始化变量。
private ViewSwitcher viewSwitcher;
viewSwitcher = (ViewSwitcher)findViewById(R.id.viewSwitcher);
4 给ViewSwitcher设置一个Factory,使用LayoutInflater.from(this). inflate(R.layout.slideimage,null)将xml布局文件转化为一个View对象,供makeView()方法使用。
viewSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
return inflater.inflate(R.layout.slideimage2,null);
}
});
5 设置next和prev方法,用于控制上下翻页,这里注意控制边界,然后给ViewSwitcher设置动画,由于自带的动画只有从左淡入,从右淡出,可以用于向前翻页,向后翻页应是相反的,所以需要自定义动画效果。
public void next(View view){
if(count>=images.length-1)
count=-1;
viewSwitcher.setInAnimation(this,R.anim.slide_in_right);
viewSwitcher.setOutAnimation(this,R.anim.slide_out_left);
ImageView img = viewSwitcher.getNextView().findViewById(R.id.slideimg);
img.setImageResource(images[++count]);
TextView tv = viewSwitcher.getNextView().findViewById(R.id.slidetx);
tv.setText("我是图片"+(count+1));
viewSwitcher.showNext();
}
public void prev(View view){
if(count<1)
count = images.length;
viewSwitcher.setInAnimation(this,android.R.anim.slide_in_left);
viewSwitcher.setOutAnimation(this,android.R.anim.slide_out_right);
ImageView img = viewSwitcher.getNextView().findViewById(R.id.slideimg);
img.setImageResource(images[--count]);
TextView tv = viewSwitcher.getNextView().findViewById(R.id.slidetx);
tv.setText("我是图片"+(count+1));
viewSwitcher.showPrevious();
}
2,TextSwitcher使用
TextSwitcher继承了 ViewSwitcher,因此它具有与ViewSwitcher相同的特征:可以在切换 View组件时使用动画效果。与ImageSwitcher相似的是,使用TextSwitcher也需要设置一个 ViewFactory。与 ImageSwitcher 不同的是,TextSwitcher 所需的 ViewFactory 的 makeView()方法必须返回一个TextView组件。
TextSwitcher与TextView的功能有点相似,它们都可用于显示文本内容,区别在于TextSwitcher的效果更炫,它可以指定文本切换时的动画效果。
效果图:
点击TextSwitcher将会切换显示的文本,同时会出现动画效果效果图:(竖向滚动条)
布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextSwitcher
android:id="@+id/text_switcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inAnimation="@android:anim/slide_in_left"
android:outAnimation="@android:anim/slide_out_right"
android:onClick="next"/>
</LinearLayout>
主程序代码如下:
public class TextSwitcherActivity extends AppCompatActivity {
private TextSwitcher textSwitcher;
private String[] strs = new String[]{"疯狂Android讲义","疯狂Java讲义","疯狂Ajax讲义"};
private int curStr=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_switcher);
textSwitcher = (TextSwitcher) findViewById(R.id.text_switcher);
textSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
TextView textView = new TextView(TextSwitcherActivity.this);
textView.setTextSize(17);
textView.setTextColor(Color.MAGENTA);
return textView;
}
});
//调用next()方法显示下一条字符串
next(null);
}
/**
* 事件处理方法
* @param view
*/
public void next(View view){
textSwitcher.setText(strs[curStr++%strs.length]);
}
}
3,ImageSwitcher使用
ImageSwitcher继承了 ViewSwitcher,因此它具有与ViewSwitcher相同的特征:可以在切换View组件时使用动画效果。ImageSwitcher继承了 ViewSwitcher,并重写了 ViewSwitcher 的 showNext()、showPrevious()方法,因此 ImageSwitcher 使用起来更加简单。
使用 ImageSwitcher 只要如下两步即可:
1,为 ImageSwitcher 提供一个 ViewFactory,该 ViewFactory 生成的 View 组件必须是 ImageView。
2,需要切换图片时,只要调用 ImageSwitcher 的 setImageDrawable(Drawable drawable)、 setImageResource(int resid)和 setImageURI(Uri uri)方法更换图片即可。
实例:支持动画的图片浏览器
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:orientation="vertical" >
<!-- 定义一个GridView组件 --> <GridView
android:id="@+id/grid01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:horizontalSpacing="pt"
android:numColumns="4"
android:verticalSpacing="2pt" />
<!-- 定义一个ImageSwitcher组件 --> <ImageSwitcher
android:id="@+id/switcher"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center_horizontal"
android:inAnimation="@android:anim/fade_in"
android:outAnimation="@android:anim/fade_out" />
</LinearLayout>
Java代码中:
public class ImageSwitcherTest extends Activity {
int[] imageIds = new int[] { R.drawable.bomb5, R.drawable.bomb6,
R.drawable.bomb7, R.drawable.bomb8, R.drawable.bomb9,
R.drawable.bomb10, R.drawable.bomb11, R.drawable.bomb12,
R.drawable.bomb13, R.drawable.bomb14, R.drawable.bomb15,
R.drawable.bomb16 };
ImageSwitcher switcher;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个List对象,List对象的元素是Map
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imageIds.length; i++) {
Map<String, Object> listItem = new HashMap<String, Object>();
listItem.put("image", imageIds[i]);
listItems.add(listItem);
}
// 获取显示图片的ImageSwitcher
switcher = (ImageSwitcher) findViewById(R.id.switcher);
// 为ImageSwitcher设置图片切换的动画效果
switcher.setFactory(new ViewFactory() {
@Override
public View makeView() {
// 创建ImageView对象
ImageView imageView = new ImageView(ImageSwitcherTest.this);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
// 返回ImageView对象
return imageView;
}
});
// 创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems , R.layout.cell, new String[] { "image" }, new int[] { R.id.image1 });
GridView grid = (GridView) findViewById(R.id.grid01);
// 为GridView设置Adapter
grid.setAdapter(simpleAdapter);
// 添加列表项被选中的监听器
grid.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 显示当前被选中的图片
switcher.setImageResource(imageIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// 添加列表项被单击的监听器
grid.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 显示被单击的图片的图片
switcher.setImageResource(imageIds[position]);
}
});
} }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-07-21 android:layout_gravity和android:gravity属性的区别
2018-07-21 RabbitMQ ——“Hello World”
2017-07-21 Visual Studio各版本工程文件之间的转换
2015-07-21 OpenXml操作Word的一些操作总结.无word组件生成word.
2015-07-21 OpenXml操作Word的一些操作总结. - 天天不在