Android开发之ViewFlipper应用(二)之手势滑动相册

 

    呵呵,最近一直在忙linux,把ViewFlipper应用(二)都落下一边了,先来回顾下http://blog.csdn.net/ch_984326013/article/details/6666302(一)我们完成之后交给大家的两点疑问:

(1)、该项目,我们实现的是单击按钮显示下一张图片或上一张图片,这里我就要问了:“我们可否通过手势在屏幕上的移动来进行图片的切换呢?”;

(2)、该项目,我们实现了三张图片的切换,但是图片好多的话。我们这么在布局中使用图片,也不是一中明智之举。那么,我们该怎样动态加载几十张甚至几百张图片呢?

下面,我们就根据一个实例来解决以上两个问题,首先我们先看下该项目的运行效果:

     

以上三张截图,分别是运行项目效果、运行项目之后鼠标向右滑动及运行项目之后鼠标向左滑动的效果图。

下面,来开分析该项目的具体开发过程。

1、创建一个Android项目,命名为ViewFlipperExample。

2、准备图片资源,在这里我准备了8张图片,把它们存放与drawable-mdpi目录中,这里大家可以自己准备图片。

3、在res目录下新建一个anim目录,在里面编写四个动画,动画内容具体如下:

push_left_in.xml:

  1. <?xml version="1.0" encoding="utf-8"?>      
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">      
  3.     <translate      
  4.     android:fromXDelta="100%p"       
  5.     android:toXDelta="0"       
  6.     android:duration="500"/>      
  7.     <alpha      
  8.     android:fromAlpha="0.0"       
  9.     android:toAlpha="1.0"     
  10.     android:duration="500" />      
  11. </set>   
<?xml version="1.0" encoding="utf-8"?>    
<set xmlns:android="http://schemas.android.com/apk/res/android">    
    <translate    
    android:fromXDelta="100%p"     
    android:toXDelta="0"     
    android:duration="500"/>    
    <alpha    
    android:fromAlpha="0.0"     
    android:toAlpha="1.0"   
    android:duration="500" />    
</set> 

push_left_out.xml:

  1. <set xmlns:android="http://schemas.android.com/apk/res/android">      
  2.     <translate      
  3.     android:fromXDelta="0"       
  4.     android:toXDelta="-100%p"       
  5.     android:duration="500"/>      
  6.     <alpha      
  7.     android:fromAlpha="1.0"       
  8.     android:toAlpha="0.0"       
  9.     android:duration="500" />      
  10. </set>   
<set xmlns:android="http://schemas.android.com/apk/res/android">    
    <translate    
    android:fromXDelta="0"     
    android:toXDelta="-100%p"     
    android:duration="500"/>    
    <alpha    
    android:fromAlpha="1.0"     
    android:toAlpha="0.0"     
    android:duration="500" />    
</set> 

push_right_in.xml:

  1. <set xmlns:android="http://schemas.android.com/apk/res/android">      
  2.     <translate      
  3.     android:fromXDelta="-100%p"       
  4.     android:toXDelta="0"       
  5.     android:duration="500"/>      
  6.     <alpha      
  7.     android:fromAlpha="0.0"       
  8.     android:toAlpha="1.0"       
  9.     android:duration="500" />      
  10. </set>  
<set xmlns:android="http://schemas.android.com/apk/res/android">    
    <translate    
    android:fromXDelta="-100%p"     
    android:toXDelta="0"     
    android:duration="500"/>    
    <alpha    
    android:fromAlpha="0.0"     
    android:toAlpha="1.0"     
    android:duration="500" />    
</set>

push_right_out.xml:

  1. <?xml version="1.0" encoding="utf-8"?>      
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">      
  3.     <translate      
  4.     android:fromXDelta="0"       
  5.     android:toXDelta="100%p"       
  6.     android:duration="500"/>      
  7.     <alpha      
  8.     android:fromAlpha="1.0"       
  9.     android:toAlpha="1.0"     
  10.     android:duration="500" />      
  11. </set>   
<?xml version="1.0" encoding="utf-8"?>    
<set xmlns:android="http://schemas.android.com/apk/res/android">    
    <translate    
    android:fromXDelta="0"     
    android:toXDelta="100%p"     
    android:duration="500"/>    
    <alpha    
    android:fromAlpha="1.0"     
    android:toAlpha="1.0"   
    android:duration="500" />    
</set> 

4、编写主布局文件,在这里不多讲,具体代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <ViewFlipper  
  8.     android:id="@+id/myViewFlipper"  
  9.     android:layout_width="wrap_content"  
  10.     android:layout_height="wrap_content"  
  11.     android:layout_gravity="center"/>  
  12. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<ViewFlipper
    android:id="@+id/myViewFlipper"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>
</LinearLayout>

5、修改主程序代码,在这里我们实现了GestureDetector.OnGestureListener接口,要实现手势滑动,这个接口必须实现。在这里也不扯淡了,看代码吧:

  1. public class Demo extends Activity implements android.view.GestureDetector.OnGestureListener{  
  2.     //声明手势识别  
  3.     GestureDetector gd;  
  4.     //声明ViewFlipper控件  
  5.     ViewFlipper vf;  
  6.     //声明图片,这里可以声明多张图片,以供使用  
  7.     int[] imageID={R.drawable.gallery_photo_1,  
  8.                    R.drawable.gallery_photo_2,  
  9.                    R.drawable.gallery_photo_3,  
  10.                    R.drawable.gallery_photo_4,  
  11.                    R.drawable.gallery_photo_5,  
  12.                    R.drawable.gallery_photo_6,  
  13.                    R.drawable.gallery_photo_7,  
  14.                    R.drawable.gallery_photo_8,  
  15.                    };  
  16.     //索引值  
  17.     int index=0;  
  18.     int flag=0;  
  19.     /** Called when the activity is first created. */  
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.         vf=(ViewFlipper)findViewById(R.id.myViewFlipper);  
  25.         LayoutParams lp=new LayoutParams(100, 150);  
  26.         //对imageID执行循环,获取ImageView对象,并把该对象添加到ViewFlipper中  
  27.         for(int i=0;i<imageID.length;i++){  
  28.             ImageView image=new ImageView(this);  
  29.             image.setImageResource(imageID[i]);  
  30.             vf.addView(image, index, lp);  
  31.             index++;  
  32.         }  
  33.         gd = new GestureDetector(this);  
  34.     }  
  35.   
  36.     @Override  
  37.     public boolean onTouchEvent(MotionEvent event) {  
  38.         // TODO Auto-generated method stub  
  39.         return this.gd.onTouchEvent(event);   
  40.     }  
  41.   
  42.     @Override  
  43.     public boolean onDown(MotionEvent e) {  
  44.         // TODO Auto-generated method stub  
  45.         return false;  
  46.     }  
  47.   
  48.     @Override  
  49.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  50.             float velocityY) {  
  51.         // TODO Auto-generated method stub  
  52.         //向左滑动  
  53.         if(e1.getX()-e2.getX()>10){  
  54.             vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));  
  55.             vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));  
  56.             //判断是否到最后一张  
  57.             if (flag % 8 == 0)  
  58.                 this.vf.showPrevious();  
  59.             else  
  60.                 this.vf.showNext();  
  61.             flag = (flag + 1) % 8;  
  62.         }  
  63.         //向右滑向  
  64.         else if(e1.getX()-e2.getX()<-10){  
  65.             vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));  
  66.             vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));  
  67.             //判断是否是第一张  
  68.             if(flag%8==0){  
  69.                 vf.showNext();  
  70.             }  
  71.             else{  
  72.                 vf.showPrevious();  
  73.             }  
  74.             flag = (flag + 1) % 8;  
  75.         }  
  76.         return false;  
  77.     }  
  78.   
  79.     @Override  
  80.     public void onLongPress(MotionEvent e) {  
  81.         // TODO Auto-generated method stub  
  82.           
  83.     }  
  84.   
  85.     @Override  
  86.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  87.             float distanceY) {  
  88.         // TODO Auto-generated method stub  
  89.         return false;  
  90.     }  
  91.   
  92.     @Override  
  93.     public void onShowPress(MotionEvent e) {  
  94.         // TODO Auto-generated method stub  
  95.           
  96.     }  
  97.   
  98.     @Override  
  99.     public boolean onSingleTapUp(MotionEvent e) {  
  100.         // TODO Auto-generated method stub  
  101.         return false;  
  102.     }  
  103. }  
public class Demo extends Activity implements android.view.GestureDetector.OnGestureListener{
	//声明手势识别
	GestureDetector gd;
	//声明ViewFlipper控件
	ViewFlipper vf;
	//声明图片,这里可以声明多张图片,以供使用
	int[] imageID={R.drawable.gallery_photo_1,
			       R.drawable.gallery_photo_2,
			       R.drawable.gallery_photo_3,
			       R.drawable.gallery_photo_4,
			       R.drawable.gallery_photo_5,
			       R.drawable.gallery_photo_6,
			       R.drawable.gallery_photo_7,
			       R.drawable.gallery_photo_8,
			       };
	//索引值
	int index=0;
	int flag=0;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        vf=(ViewFlipper)findViewById(R.id.myViewFlipper);
        LayoutParams lp=new LayoutParams(100, 150);
        //对imageID执行循环,获取ImageView对象,并把该对象添加到ViewFlipper中
        for(int i=0;i<imageID.length;i++){
        	ImageView image=new ImageView(this);
        	image.setImageResource(imageID[i]);
        	vf.addView(image, index, lp);
            index++;
        }
        gd = new GestureDetector(this);
    }

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		return this.gd.onTouchEvent(event); 
	}

	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		// TODO Auto-generated method stub
		//向左滑动
		if(e1.getX()-e2.getX()>10){
			vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
			vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
			//判断是否到最后一张
			if (flag % 8 == 0)
				this.vf.showPrevious();
	        else
			    this.vf.showNext();
	        flag = (flag + 1) % 8;
		}
		//向右滑向
		else if(e1.getX()-e2.getX()<-10){
			vf.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
			vf.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
			//判断是否是第一张
			if(flag%8==0){
				vf.showNext();
			}
			else{
				vf.showPrevious();
			}
			flag = (flag + 1) % 8;
		}
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}
}

6、到这里,我们的项目就开发完全了。运行该项目,便会得到以上效果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值