原文地址:http://blog.csdn.net/wangyuexing_blog/article/details/21962289
因为在ViewPager中设置ImageView的点击事件来finish Activity 有时候会误操作,用户体验不好,本来用户是滑动ViewPager查看下一张图片的,但ImageView的点击事件会响应,从而关闭了整个页面。
接下来,我们用另一种方式实现点击结束activity的效果,和ViewPager搭配算是比较完美,既不影响用户左右滑动浏览,在需要关闭页面时,触摸一下屏幕就会关闭activity。
实现ImageView的touch事件:
- iv.setOnTouchListener(new OnTouchListener()
- {
- @Override
- public boolean onTouch(View v, MotionEvent event)
- {
- switch (event.getAction())
- {
- case MotionEvent.ACTION_DOWN:
- isClose = true;
- startPoint.set(event.getX(), event.getY());
- break;
- case MotionEvent.ACTION_MOVE:
- if(Math.abs((event.getX() - startPoint.x)) > DensityUtil.dip2px(context, 5)
- || Math.abs((event.getY() - startPoint.y)) > DensityUtil.dip2px(context, 5))
- {
- isClose = false;
- }
- break;
- case MotionEvent.ACTION_UP:
- if(isClose)
- {
- finish();
- overridePendingTransition(R.anim.default_anim_out, R.anim.anim_stay);
- }
- break;
- default:
- break;
- }
- return true;
- }
- });
申明全局变量:
- /** 觸摸ImageView是否finish Activity */
- private boolean isClose;
- /** 觸屏的第一點坐標 */
- private PointF startPoint = new PointF();
附上工具类 DensityUtil.java:
- import android.content.Context;
- /**
- * 功能描述:单位转换工具类
- *
- * @author android_ls
- *
- */
- public class DensityUtil
- {
- /**
- * 将单位为dip的值转换成单位为px的值
- *
- * @param context
- * Context
- * @param dipValue
- * dip值
- * @return px值
- */
- public static int dip2px(Context context, float dipValue)
- {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (dipValue * scale + 0.5f);
- }
- /**
- * 将单位为px的值转换成单位为dip的值
- *
- * @param context
- * Context
- * @param pxValue
- * 像素值
- * @return dip值
- */
- public static int px2dip(Context context, float pxValue)
- {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (pxValue / scale + 0.5f);
- }
- /**
- * 将px值转换为sp值,保证文字大小不变
- *
- * @param pxValue
- * @param fontScale (DisplayMetrics类中属性scaledDensity)
- * @return
- */
- public static int px2sp(Context context, float pxValue)
- {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (pxValue / scale + 0.5f);
- }
- /**
- * 将sp值转换为px值,保证文字大小不变
- *
- * @param spValue
- * @param fontScale
- * (DisplayMetrics类中属性scaledDensity)
- * @return
- */
- public static int sp2px(Context context, float spValue)
- {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (spValue * scale + 0.5f);
- }
- }