ViewAnimator使用

news/2024/12/5 5:07:14/

一、手势控制

1.手势分类:

  • 在屏幕上的连续触碰行为,如左右滑动 。 系统提供了手势检测以及监听器。
  • 在屏幕上绘制不规则的几何图形,如画一个圆圈。允许开发者自定义手势,系统提供了相应API来识别。

这里主要讲第一种。

2.手势检测

GestureDetector:常用手势

  • onDown(MotionEvent e) 触碰事件按下
  • onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocity velocityY) 在屏幕上拖动
  • onLongPress(MotionEvent e) 长按
  • onScroll(MotionEvent e1,MotionEvent e2,float distanceX,float distanceY) 在屏幕上滚动
  • onShowPress(MotionEvent e) 在屏幕按下,但未移动和松开
  • onSingleTapUp(MotionEvent e) 在屏幕轻击

使用方法:

  1. 创建一个GestureDetector对象,同时实现一个GestureDetector.OnGestureListener监听器
  2. 为需要监听的组件的onTouchEvent绑定监听器,交给GestureDetector处理

特别注意:
关于onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocity velocityY)函数:

  • e1:手势起点的移动事件
  • e2: 当前手势点的移动事件
  • velocityX: 每秒x轴方向移动的像素
  • velocityY: 每秒y轴方向移动的像素

说的更简单点就是,鼠标手势相当于一个向量(当然有可能手势是曲线),e1为向量的起点,e2为向量的终点,velocityX为向量水平方向的速度,velocityY为向量垂直方向的速度



具体示例:
监听Activity的滑动手势,以此实现ViewFlipper的页面切换


public class GestureFlip extends Activity implements OnGestureListener
{// ViewFlipper实例ViewFlipper flipper;// 定义手势检测器实例GestureDetector detector;// 定义一个动画数组,用于为ViewFlipper指定切换动画效果Animation[] animations = new Animation[4];// 定义手势动作两点之间的最小距离final int FLIP_DISTANCE = 50;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 创建手势检测器detector = new GestureDetector(this, this);// 获得ViewFlipper实例flipper = (ViewFlipper) this.findViewById(R.id.flipper);// 为ViewFlipper添加5个ImageView组件flipper.addView(addImageView(R.drawable.java));flipper.addView(addImageView(R.drawable.ee));flipper.addView(addImageView(R.drawable.ajax));flipper.addView(addImageView(R.drawable.xml));flipper.addView(addImageView(R.drawable.classic));// 初始化Animation数组animations[0] = AnimationUtils.loadAnimation(this, R.anim.left_in);animations[1] = AnimationUtils.loadAnimation(this, R.anim.left_out);animations[2] = AnimationUtils.loadAnimation(this, R.anim.right_in);animations[3] = AnimationUtils.loadAnimation(this, R.anim.right_out);}// 定义添加ImageView的工具方法private View addImageView(int resId){ImageView imageView = new ImageView(this);imageView.setImageResource(resId);imageView.setScaleType(ImageView.ScaleType.CENTER);return imageView;}@Overridepublic boolean onFling(MotionEvent event1, MotionEvent event2,float velocityX, float velocityY){// 如果第一个触点事件的X座标大于第二个触点事件的X座标超过FLIP_DISTANCE// 也就是手势从右向左滑。if (event1.getX() - event2.getX() > FLIP_DISTANCE){// 为flipper设置切换的的动画效果flipper.setInAnimation(animations[0]);flipper.setOutAnimation(animations[1]);flipper.showPrevious();return true;}// 如果第二个触点事件的X座标大于第一个触点事件的X座标超过FLIP_DISTANCE// 也就是手势从右向左滑。else if (event2.getX() - event1.getX() > FLIP_DISTANCE){// 为flipper设置切换的的动画效果flipper.setInAnimation(animations[2]);flipper.setOutAnimation(animations[3]);flipper.showNext();return true;}return false;}
@Overridepublic boolean onTouchEvent(MotionEvent event) {// 将该Activity上的触碰事件交给GestureDetector处理return detector.onTouchEvent(event);}
 @Overridepublic boolean onDown(MotionEvent arg0){return false;}@Overridepublic void onLongPress(MotionEvent event){ }@Overridepublic boolean onScroll(MotionEvent event1, MotionEvent event2, float arg2, float arg3){return false;}@Overridepublic void onShowPress(MotionEvent event){ }@Overridepublic boolean onSingleTapUp(MotionEvent event){return false;}
}

二、关于AnimationDrawable资源的使用

Android支持两种类型的动画:

  • 逐帧动画(Frame):一张张切换图片形成动画效果。
  • 补间动画(Tween):以平移、旋转、缩放等方式进行变换。

这两者各有其特点及应用场合。

从xml文件来看:
逐帧动画:

 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
<item android:drawable="@drawable/rocket_thrust1" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
<item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

补间动画:

 
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="200"/>
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="-50"
android:duration="200" />
</set>

还有这种:

 
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0"
android:animationOrder="normal"
android:animation="@anim/rotate" />



这里简单介绍下补间动画的使用:
在AnimationDrawable文件的<set></set>中可定义如下四种元素:

  • alpha:透明度的改变
  • scale:图片缩放
  • translate:图片位移变换
  • rotate:旋转

使用动画:

 
public class AnimationDrawable extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView image = (ImageView)findViewById(R.id.image);
// 加载动画资源
final Animation anim = AnimationUtils.loadAnimation(this,R.anim.my_anim);
// 设置动画结束后保留结束状态
anim.setFillAfter(true);
Button bn = (Button) findViewById(R.id.bn);
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 开始动画
image.startAnimation(anim);
}
});
}
}

更多的用法在后面介绍。


三、ViewAnimator的使用

ViewSwitcher、ViewFlipper、TextSwitcher、ImageSwitcher都继承于ViewAnimator,而ViewAnimator又继承自FrameLayout。

ViewAnimator继承了FrameLayout的特征:可将多个View组件叠在一起。它所额外增加的功能是:在View切换时表现出动画效果

1.ImageSwitcher使用

ViewSwitcher、ImageSwitcher、TextSwitcher三者用法非常类似,这里以ImageSwitcher为例。

使用方法:

  • 在布局文件中使用ImageViewSwitcher,设置动画效果。
  • 为ImageSwitcher提供ViewFactory,设置ImageView的一些参数。
  • 需要切换时,调用ImageSwitcher的setImageDrawable、setImageResource或setImageURI方法来切换图片。
 
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
// 使用/layout/cell.xml文件作为界面布局
, 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]);
}
});
}
}

从实际效果来看,它与普通的ImageView的区别在于加上了图片切换之间的动画效果,因此切换起来比较炫。

2.ViewFlipper的使用

使用非常简洁,当然其中的动画效果设置也可以在布局文件中完成。

 
public class ViewFlipperTest extends Activity
{
private ViewFlipper viewFlipper;
 
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
viewFlipper = (ViewFlipper) findViewById(R.id.details);
}
 
public void prev(View source)
{
viewFlipper.setInAnimation(this, R.anim.slide_in_right);
viewFlipper.setOutAnimation(this, R.anim.slide_out_left);
// 显示上一个组件
viewFlipper.showPrevious();
// 停止自动播放
viewFlipper.stopFlipping();
}
 
public void next(View source)
{
viewFlipper.setInAnimation(this, android.R.anim.slide_in_left);
viewFlipper.setOutAnimation(this, android.R.anim.slide_out_right);
// 显示下一个组件。
viewFlipper.showNext();
// 停止自动播放
viewFlipper.stopFlipping();
}
 
public void auto(View source)
{
viewFlipper.setInAnimation(this, android.R.anim.slide_in_left);
viewFlipper.setOutAnimation(this, android.R.anim.slide_out_right);
// 开始自动播放
viewFlipper.startFlipping();
}
}

布局文件:
ViewFlipper包含3个View,当该也可以在java代码中通过addView()方式来动态添加。

 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
 
<ViewFlipper
android:id="@+id/details"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:persistentDrawingCache="animation"
android:flipInterval="1000">
<ImageView
android:src="@drawable/java"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ImageView>
<ImageView
android:src="@drawable/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ImageView>
<ImageView
android:src="@drawable/ee"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</ImageView>
</ViewFlipper>
 
<Button
android:text="<"
android:onClick="prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:onClick="auto"
android:text="自动播放" />
<Button
android:text=">"
android:onClick="next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" />
</RelativeLayout>

http://www.ppmy.cn/news/265341.html

相关文章

今天看到一个不错的漫画网站(E文)

网址如下&#xff1a; www.politicalcartoons.com 要求&#xff1a; 1.熟悉美国口语 2.了解国际时事新闻 3.100左右的智商

TOOLS:webcomic

webcomic: 一个使用缓存构建的漫画站点。(rails2.0.2) 一.基本的管理系统 1.上传漫画 实现上传功能的插件&#xff1a; ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/attachment_fu/ 2.Comic模型 ruby script/generate scaffold Comic con…

viewer图片查看器

Viewer.js 是一款强大的图片查看器&#xff0c;像门户网站一般都会有各自的图片查看器&#xff0c;如果您正需要一款强大的图片查看器&#xff0c;也许 Viewer.js 是一个很好的选择。集成使用非常简单&#xff0c;Viewer.js 有以下特点&#xff1a; 支持移动设备触摸事件支持响…

ViewAnimator动画

最近研究动画时&#xff0c;发现一个比较好用的一个设置动画的ViewAnimator&#xff0c;感觉挺是实用的&#xff0c;记录下&#xff1a; 在build.gradle中加入&#xff1a; compile com.github.florent37:viewanimator:1.0.5 简单的一些用法&#xff1a; 1.一个方法多个视图…

android漫画app代码,漫画书Android客户端 – ComicApp

漫画书 1.平台&#xff1a;Android客户端(后期完善IOS端) 2.开发框架&#xff1a;React Native react-redux react-thunk 3.开发工具&#xff1a;Vs Code 1.8 1.项目架构 app actions 用户行为 reducer 对用户行为进行分发&#xff0c;更新状态 store 整合全部reducer containe…

ViewAnimator教程

本文翻译自ViewAnimator Tutorial With Example In Android Studio 在Android中&#xff0c;ViewAnimator是FrameLayout的一个子类&#xff0c;用来做Views之间的切换。它是一个变换控件的 元素&#xff0c;帮助我们在Views之间&#xff08;如TextView, ImageView或者其他layo…

从Manga Reader爬取我喜欢的漫画

自去年十月份实习后&#xff0c;就没碰过博客了。今天偶然间翻到了一年前为了看一个韩国漫画而写的一个爬虫脚本。也许过一段时间&#xff0c;这个脚本就彻底消失了。为了不让它消失&#xff0c;就存到我的博客上吧。 下面直接上代码&#xff0c;技术用的不是很多&#xff0c;主…