码迷,mamicode.com
首页 > 移动开发 > 详细

Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)

时间:2015-01-13 17:27:02      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)
Android中dp和px之间进行转换

在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding,并没有提供设置dp的方法。这个时候,如果需要设置dp的话,就要将dp转换成px了。

以下是一个应用类,方便进行px和dp之间的转换。



    import android.content.Context;  
      
    public class DensityUtil {  
      
        /** 
         * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
         */  
        public static int dip2px(Context context, float dpValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            return (int) (dpValue * scale + 0.5f);  
        }  
      
        /** 
         * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
         */  
        public static int px2dip(Context context, float pxValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            return (int) (pxValue / scale + 0.5f);  
        }  
    }  





    import android.content.Context;  
      
    public class DensityUtil {  
      
        /** 
         * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
         */  
        public static int dip2px(Context context, float dpValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            return (int) (dpValue * scale + 0.5f);  
        }  
      
        /** 
         * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
         */  
        public static int px2dip(Context context, float pxValue) {  
            final float scale = context.getResources().getDisplayMetrics().density;  
            return (int) (pxValue / scale + 0.5f);  
        }  
    }  
    public class ViewFlipperActivity extends Activity implements OnGestureListener {  
          
        private static final int FLING_MIN_DISTANCE = 100;  
        private ViewFlipper flipper;  
        private GestureDetector detector;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.viewflipper);  
            // 注册一个GestureDetector  
            detector = new GestureDetector(this);  
            flipper = (ViewFlipper) findViewById(R.id.ViewFlipper);  
            ImageView image1 = new ImageView(this);  
            image1.setBackgroundResource(R.drawable.image1);  
            // 增加第一个view  
            flipper.addView(image1);  
            ImageView image2 = new ImageView(this);  
            image2.setBackgroundResource(R.drawable.image2);  
            // 增加第二个view  
            flipper.addView(image2);  
        }  
      
        @Override  
        public boolean onTouchEvent(MotionEvent event) {  
            // 将触屏事件交给手势识别类处理  
            return this.detector.onTouchEvent(event);  
        }  
      
        @Override  
        public boolean onDown(MotionEvent e) {  
            return false;  
        }  
      
        @Override  
        public void onShowPress(MotionEvent e) {  
        }  
      
        @Override  
        public boolean onSingleTapUp(MotionEvent e) {  
            return false;  
        }  
      
        @Override  
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
                float distanceY) {  
            return false;  
        }  
      
        @Override  
        public void onLongPress(MotionEvent e) {  
        }  
      
        @Override  
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
                float velocityY) {  
            if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE) {  
                //设置View进入和退出的动画效果  
                this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,  
                        R.anim.left_in));  
                this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,  
                        R.anim.left_out));  
                this.flipper.showNext();  
                return true;  
            }  
            if (e1.getX() - e2.getX() < -FLING_MIN_DISTANCE) {  
                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;  
            }  
            return false;  
        }  
    }  

在这段代码里,创建了两个IamgeView(用来显示图片),加入到了ViewFlipper中。程序运行后,当用手指在屏幕上向左滑动,会显示前一个图片,用手指在屏幕上向右滑动,会显示下一个图片。实现滑动切换的主要代码都在onFling()方法中,用户按下触摸屏,快速移动后松开,就会触发这个事件。在这段代码示例中,对手指滑动的距离进行了计算,如果滑动距离大于100像素,就做切换动作,否则不做任何切换动作。

可以看到,onFling()方法有四个参数,e1和e2上面代码用到了,比较好理解。参数velocityX和velocityY是做什么用的呢?velocityX和velocityY实际上是X轴和Y轴上的移动速度,单位是像素/秒。结合这两个参数,可以判断滑动的速度,从而做更多的处理。

为了显示出滑动的效果,这里调用了ViewFlipper的setInAnimation()和setOutAnimation()方法设置了View进入和退出的动画。对于动画的使用,这里不再赘述,也不再给出具体的XML文件代码了。

 

另外,在上面的代码基础上说些额外的话题。

在Xml布局文件中,我们既可以设置像素px,也可以设置dp(或者dip)。

一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的手机上布局一致。但是在代码中,一般是无法直接使用dp的。

拿上面的代码为例,代码中定义了滑动的距离阀值为100像素。这就会导致不同分辨率的手机上效果有差别。比如在240X320的机型上,和在480X800的机型上,想要切换View,需要手指滑动的距离是不同的。所以,一般情况下,建议在代码中,也不要用像素,也用dp。

那么既然无法直接用dp,就需要从px转换成dp了。

 

Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)

标签:

原文地址:http://www.cnblogs.com/qiuyang1/p/4221691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!