Android实现View的拖拽
时间:2022-07-27
本文章向大家介绍Android实现View的拖拽,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了Android实现View拖拽的具体代码,供大家参考,具体内容如下
前言
实现View的拖拽,其实原理很简单。无非就是获取手指的位移信息,然后view根据手指的位移信息,移动对应的位置。
首先是获取手机的位移信息就可以根据需求不同分为两种
- 拖拽view本身,view实现移动。则设置view的setOnTouchListener。
- 在activity中随意滑动,view都会反应出动作。则重写activity onTouchEvent方法。
而移动的方法嘛,也有几种
- 给view设置补间动画,动画时间为0.(不推荐,因为移动的只是view的影子,本地还在原地)
- 更改view 的margin。(不推荐,会影响viewgroup的布局排布)
- 根据属性动画原理,更改setTranslationX和setTranslationY.(推荐此方法,不会影响原理的布局排布)
代码
public class ViewTestActivity extends AppCompatActivity {
private static final String TAG = "ViewTestActivity";
private TextView mTv1,mTv2;
private double lastx,lastY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_test);
mTv1= (TextView) findViewById(R.id.tv01);
mTv1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
double x=event.getRawX();
double y=event.getRawY();
Log.d(TAG, "onTouch: "+event.getAction());
if (event.getAction()==MotionEvent.ACTION_DOWN){
lastx=x;
lastY=y;
}else if (event.getAction()==MotionEvent.ACTION_MOVE){
double dx=x-lastx;
double dy=y-lastY;
Log.d(TAG, "onTouch: dx=="+dx+",dy=="+dy);
// startAnimation(dx,dy);
// moveMethod1(dx, dy);
moveMethod2(dx, dy);
lastx=x;
lastY=y;
}
return true;
}
});
}
// @Override
// public boolean onTouchEvent(MotionEvent event) {
// double x=event.getRawX();
// double y=event.getRawY();
// Log.d(TAG, "onTouch: "+event.getAction());
// if (event.getAction()==MotionEvent.ACTION_DOWN){
// lastx=x;
// lastY=y;
// }else if (event.getAction()==MotionEvent.ACTION_MOVE){
// double dx=x-lastx;
// double dy=y-lastY;
// Log.d(TAG, "onTouch: dx=="+dx+",dy=="+dy);
//// startAnimation(dx,dy);
//
// // moveMethod1(dx, dy);
// moveMethod2(dx, dy);
//
// lastx=x;
// lastY=y;
// }
// return true;
// }
//根据属性动画的原理
private void moveMethod2(double dx, double dy) {
mTv1.setTranslationX((float) (mTv1.getTranslationX()+dx));
mTv1.setTranslationY((float) (mTv1.getTranslationY()+dy));
}
//根据margin 原理
private void moveMethod1(double dx, double dy) {
ViewGroup.MarginLayoutParams marginLayoutParams= (ViewGroup.MarginLayoutParams) mTv1.getLayoutParams();
marginLayoutParams.leftMargin+=dx;
marginLayoutParams.topMargin+=dy;
mTv1.setLayoutParams(marginLayoutParams);
}
private void startAnimation(double dx, double dy) {
ObjectAnimator objectAnimator=ObjectAnimator.ofFloat(mTv1,"translationX", (float) (mTv1.getTranslationX()+dx)).setDuration(3000);
objectAnimator.start();
ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(mTv1,"translationY", (float) (mTv1.getTranslationY()+dy)).setDuration(3000);
objectAnimator2.start();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助。
- 页面json 格式化+颜色高亮
- Python 里 and、or 的计算规则
- Python中赋值、浅拷贝与深拷贝
- git 简易使用说明
- 开发篇-MySQL分区(一)
- Establishing SSL connection without server's identity verification is not recommended. According to
- Django-认证系统
- javascript:双链表-插入排序
- javascript:二叉搜索树 实现
- 自然语言处理 语言模型介绍
- 口水先擦干!从大数据看外卖如何拯救“忙”与“宅”
- javascript:巧用eval函数组装表单输入项为json对象
- Django——model基础
- java学习:日期的运算
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 正则十八式-第一式:直捣黄龙
- 安装Grafana并使用Cloudera Manager DataSource
- Python中类变量、成员变量、局部变量的区别
- Android 友盟第三方登录与分享的实现代码
- Android实现双击返回键退出应用实现方法详解
- [- 多媒体 -] OpenGLES3.0 接入视频实现特效 - 引言
- OpenLDAP集成sssd同步用户并集成SSH登录
- 【 FlutterUnit 食用指南】 开源篇
- Flutter中如何实现无Context跳转详解
- MySQL常见问题一
- Android WiFi热点开发的示例代码
- android实现简单计算器功能
- 【 Flutter Unit 解牛篇 】代码折叠展开面板,怎么没有线?
- Android自定义底部弹出框ButtomDialog
- Android使用SoundPool播放音效实例