关于Android中View滑动知识的一点个人理解

12 篇文章 0 订阅

     View是Android中重要性不亚于四大组件的存在。今天主要看看Android中关于View滑动的一些小知识点       

     View的滑动在Android中有三种方式:       1.使用scrollTo或  scrollBy;2.使用动画;3.改变布局参数(改变LayoutParams)       

     下面是一个随手指在屏幕上随意滑动的小例子(Android开发艺术探索 这本书上的):     

       其中有一些小的细节一直没有搞明白,今天看书的时候突然明白了,记下笔记:        

       代码如下:

      

       


 public class MoveView extends TextView {

	private int mLastX;
	private int mLastY;

	public MoveView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		boolean isIntercept = false;
		int rawX = (int) event.getRawX();
		int rawY = (int) event.getRawY();
		Log.e("rawX", String.valueOf(rawX));
		Log.e("rawY", String.valueOf(rawY));
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			isIntercept = true;
			break;
		case MotionEvent.ACTION_MOVE:
			int dx = rawX - mLastX;
			int dy = rawY - mLastY;
			Log.e("dX", String.valueOf(dx));
			Log.e("dY", String.valueOf(dy));
			Log.e("TranslationX", String.valueOf(getTranslationX()));
			Log.e("TranslationY", String.valueOf(getTranslationY()));
			int dx1 = (int) getTranslationX() + dx;
			int dy1 = (int) getTranslationY() + dy;
			setTranslationX(dx1);//此处改为dx下面改为dy后,是无法实现随手指滑动的,
			setTranslationY(dy1);//具体原因是因为 dx与dy是当前相对于屏幕的坐标与前一次相对于屏幕的坐标之差
			                    //而当手指从MoveView上滑动,这个dx与dy是有一个范围的,就是MoveView左上角坐标与MoveView右下角坐标之差(可能为正也可能为负);
			                    //也就是说|dx|<=MoveView宽度  |dy|<=MoveView高度,所以改为dx及dy后,MoveView只能稍微在一个范围内移动,而无法实现全屏移动。

			isIntercept = true;
			break;
		case MotionEvent.ACTION_UP:
			isIntercept = false;
			break;
		default:
			break;
		}
		mLastX = rawX;
		mLastY = rawY;
		return isIntercept;
	}

}
         

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidView滑动灵敏度可以通过设置View滑动阈值来实现。可以通过设置View的setOnTouchListener方法,在OnTouchListener的回调函数获取手指的滑动距离,并根据需要进行相应的处理。 例如,可以通过设置一个滑动距离阈值,当手指滑动距离超过该阈值时才进行滑动操作,可以实现View滑动灵敏度控制。具体实现方式可以参考以下代码示例: ``` view.setOnTouchListener(new View.OnTouchListener() { private float startX; private float startY; private float moveX; private float moveY; private float distanceX; private float distanceY; private int touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: moveX = event.getX(); moveY = event.getY(); distanceX = moveX - startX; distanceY = moveY - startY; if (Math.abs(distanceX) > touchSlop || Math.abs(distanceY) > touchSlop) { // 滑动距离超过阈值,进行相应的操作 // TODO: 进行滑动操作 } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: startX = 0; startY = 0; moveX = 0; moveY = 0; distanceX = 0; distanceY = 0; break; } return true; } }); ``` 在该代码,我们通过获取手指在屏幕上的滑动距离,计算出滑动的横向和纵向距离,当滑动距离超过阈值时,执行相应的滑动操作。可以通过调整touchSlop的值来控制滑动灵敏度的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值