因为在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);
}
}