首页 > 代码库 > Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)
Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)
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之间进行转换)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。