栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android实现拖动效果的两种方法

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android实现拖动效果的两种方法

因为最近项目的需要,需要实现一个拖动效果,看了一下网上刚好有这种拖动效果的demo,代码大概如下:

private void initListener(){
    screenWidth = getScreenWidth(this);//获取屏幕宽度
    screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//屏幕高度-状态栏
    testTv.setonTouchListener(new View.onTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {

   case MotionEvent.ACTION_DOWN:
     lastX = (int) event.getRawX();
     lastY = (int) event.getRawY();
     break;

   case MotionEvent.ACTION_MOVE:
     int dx = (int) event.getRawX() - lastX;
     int dy = (int) event.getRawY() - lastY;

     int top = v.getTop() + dy;


     int left = v.getLeft() + dx;


     if (top <= 0) {
top = 0;
     }
     if (top >= screenHeight - testTv.getHeight() ) {
top = screenHeight - testTv.getHeight();
     }
     if (left >= screenWidth - testTv.getWidth()) {
left = screenWidth - testTv.getWidth();
     }

     if (left <= 0) {
left = 0;
     }


     v.layout(left, top, left+v.getWidth(), top+v.getHeight());

     v.postInvalidate();

     lastX = (int) event.getRawX();
     lastY = (int) event.getRawY();

 break;
 case MotionEvent.ACTION_UP:
 break;

 }
 return true;//这里根据项目需要选择false与true
      }
    });
  }

可是我的项目本身是有涂鸦的界面,还有很多复杂的事件,发现会有很奇怪的效果,抖动很厉害,而且时不时回到原来的位置,后来发现这个v.layout(left, top, left+v.getWidth(), top+v.getHeight());可能不适合项目的需求,所以我想了另一种解法。代码如下:

 private void initListener(){
    screenWidth = getScreenWidth(this);//获取屏幕宽度
    screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//屏幕高度-状态栏
    testTv.setonTouchListener(new View.onTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {

   case MotionEvent.ACTION_DOWN:
     lastX = (int) event.getRawX();
     lastY = (int) event.getRawY();
     break;

   case MotionEvent.ACTION_MOVE:
     int dx = (int) event.getRawX() - lastX;
     int dy = (int) event.getRawY() - lastY;

     int top = v.getTop() + dy;


     int left = v.getLeft() + dx;


     if (top <= 0) {
top = 0;
     }
     if (top >= screenHeight - testTv.getHeight() ) {
top = screenHeight - testTv.getHeight();
     }
     if (left >= screenWidth - testTv.getWidth()) {
left = screenWidth - testTv.getWidth();
     }

     if (left <= 0) {
left = 0;
     }

     RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(v.getWidth(), v.getHeight());
     param.leftMargin = left;
     param.topMargin = top;
     v.setLayoutParams(param);
//     v.layout(left, top, left+v.getWidth(), top+v.getHeight());

     v.postInvalidate();

     lastX = (int) event.getRawX();
     lastY = (int) event.getRawY();

 break;
 case MotionEvent.ACTION_UP:
 break;

 }
 return true;
      }
    });
  }

效果如下图:

觉得可以了,不过要注意一些事项:键盘弹出需要自己处理一下(比如处理成弹出键盘就不能移动这些,不然会变形的),我觉得这种写法可以应用于各种复杂的场景。好了,今天一些项目问题总结就到这里了,希望对大家有帮助,代码也上传了,地址如下:Android实现拖动效果

以上所述是小编给大家介绍Android实现拖动效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/156355.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号