最近研究了下android系统下的幻灯片效果,考虑用控件ViewFlipper来实现这种动画效果,另外加上手势拖动随意切换图片,重写ViewAnimator的动画,使幻灯片随意如自己DIY的图像显示.
先定义一个测试数组int imageSource[],包含30副图(之所以这么多,是为解决后面可能碰到的内存溢出问题)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
detector = new GestureDetector(this);
flipper=new ViewFlipper(this);
flipper.setBackgroundColor(Color.BLACK);
imageCount=imageSource.length-25;
addViewToFlipper();
setContentView(flipper);
startFlipping();
}
public void addViewToFlipper(){
for (int i = 0; i < imageCount; i++) {
flipper.addView(addMyView(imageSource[i],i));
}
}
/**
* 初始化要播放的图片资源
*/
public View addMyView(int id,int index){
ImageView imageView=new ImageView(this);
LinearLayout lin=new LinearLayout(this);
lin.setBackgroundResource(R.drawable.myfacebg);
LinearLayout.LayoutParams params=new LayoutParams
(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT );
lin.setOrientation(LinearLayout.VERTICAL);
Drawable draw;
draw=this.getResources().getDrawable(id);
imageView.setBackgroundDrawable(draw);
imageView.setLayoutParams(params);
lin.setGravity(Gravity.CENTER);
lin.addView(imageView);
return lin;
}
imageCount=imageSource.length-25,之所以要减去25是因为flipper一次不能装载过多图片,不然会抛出内存溢出异常,后面将解决如何将这30张图片都用幻灯片显示出来。
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_AOTOPLAY:
if (!mKeepFlipping) {
item.setTitle("停止播放");
startFlipping();
}
else{
item.setTitle("自动播放");
stopFlipping();
}
break;
case MENU_EXIT:
flipper.removeAllViews();
this.finish();
break;default:
break;
}
return super.onOptionsItemSelected(item);
}上面为播放和停止播放按钮,调用了重写的startFlipping()和stopFlipping()方法,之所以要重写是因为后面将为flipper显示图片自动加载剩余的资源文件:
/**
* 自动加载资源
*/
public void addViewExtra(){
if (!((imageCount+addCount)==30)) {
flipper.addView(addMyView(imageSource[imageCount+addCount],imageCount+addCount));
addCount++;
setContentView(flipper);
}
}
/**
* 自动卸载资源
*/
public void reduceViewExtra(){
if (!((imageCount+addCount)==30)) {
flipper.removeViewAt(0);
setContentView(flipper);
}
}上面自动加载资源如同listview一样拖动滚动栏下面即会自动加载下面的list列表项,只不过我这里加载是看不见的,全部处理是在内存中,但这种处理是犹为重要的,不然一次加载过多图片即出现异常。
/**
* 触屏事件动画
*/
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e1.getX() - e2.getX() > 120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.left_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.left_out));
this.flipper.showNext();
addViewExtra();
reduceViewExtra();
return true;
} else if (e1.getX() - e2.getX() < -120) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.right_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.right_out));
this.flipper.showPrevious();
return true;
} else if (e1.getY() - e2.getY() > 200) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_up_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_up_out));
this.flipper.showNext();
Log.i("push up in","push up in");
addViewExtra();
reduceViewExtra();
return true;
} else if (e1.getY() - e2.getY() < -200) {
this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_down_in));
this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
R.anim.push_down_out));
this.flipper.showPrevious();
return true;
}
return false;
}
这部分为继承自OnGestureListener接口的覆写方法,为拖动鼠标后图片的移动方式。动画可自己定义效果。目前在XML里定义的动画效果似乎只有2D的,3D效果在这里难以实现。如谁有3D实现,非常希望得到指点。