android幻灯片效果自定义

来源:互联网 发布:wemall商业版源码 编辑:程序博客网 时间:2024/04/30 00:08
 

最近研究了下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实现,非常希望得到指点。


原创粉丝点击