Android-满屏幕拖动的控件
来源:互联网 发布:ps软件使用视频教程 编辑:程序博客网 时间:2024/05/23 17:57
今天做个有意思的效果吧,控件的拖拽,先看一下模拟器运行:
也就是,用户可以随心所欲的拖动控件,布局文件很简单就是一个Button控件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/id_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
MainActivity.java:
package com.example.administrator.followview;
public class MainActivity extends Activity implements View.OnTouchListener {
private Button mButton;
private ViewGroup mViewGroup;
private int xDelta;
private int yDelta;
public static final String TAG = "YAYUN";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewGroup = (ViewGroup) findViewById(R.id.root);
mButton = (Button) findViewById(R.id.id_text);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.leftMargin = 50;
layoutParams.topMargin = 50;
mButton.setLayoutParams(layoutParams);
mButton.setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
final int x = (int) event.getRawX();
final int y = (int) event.getRawY();
Log.d(TAG, "onTouch: x= " + x + "y=" + y);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view
.getLayoutParams();
xDelta = x - params.leftMargin;
yDelta = y - params.topMargin;
Log.d(TAG, "ACTION_DOWN: xDelta= " + xDelta + "yDelta=" + yDelta);
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
.getLayoutParams();
int xDistance = x - xDelta;
int yDistance = y - yDelta;
Log.d(TAG, "ACTION_MOVE: xDistance= " + xDistance + "yDistance=" + yDistance);
layoutParams.leftMargin = xDistance;
layoutParams.topMargin = yDistance;
view.setLayoutParams(layoutParams);
break;
}
mViewGroup.invalidate();
return true;
}
}
MainActivity实现了OnTouchListener接口,覆写了onTouch方法,每次回调这个方法通过x和y变量记录当前的坐标。
ACTION_DOWN是在按下的时候调用(没抬起来只调用一次),通过xDelta和yDelta来记录第一次按下的点相对于控件左上角的位置,也就是相对距离。
ACTION_MOVE移动的时候不断调用,通过xDistance和yDistance来记录移动的相对距离作为leftMargin和topMargin再动态设置给控件。
最后,调用invalidate方法更新控件位置。
解释起来不容易解释,理解起来也不容易理解,我们可以看一下Log,帮助理解:
按下的时候,首先打印当前的坐标为(131,75),由于在onCreate方法中设置了初始的leftMargin和topMargin都为50,所以此时xDelta的值为131-50=81,yDelta的值为75-50=25。第一个ACTION_MOVE的xDistance为132-81=51,yDistance的值为80-25=55,同理,后面都是循环调用了。
这里主要要注意相对的概念,计算的都是相对距离。
这个效果直接用到的场景不多,但是里面的处理思路都是在开发中经常会用到的,onTouch方法也是控件交互经常会用到的方法,这方面要很熟悉。
希望这个简单的实例可以给大家带来思维的碰撞。
作者准备这篇文章要60分钟,读者读完这篇文章可能少于6分钟,您分享它不多于6秒钟,朋友圈让我们体会到了没有成本的分享是多麽快乐的一件事~
谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.
请关注我的新浪微博:AndroidTip
CSDN博客:http://blog.csdn.net/yayun0516
- Android-满屏幕拖动的控件
- Android-满屏幕拖动的控件
- Android-满屏幕拖动的控件
- Android控件的拖动
- Android 控件的拖动
- Android控件拖动的实现
- Android控件拖动的实现
- Android控件拖动的实现
- Android控件拖动的实现
- Android控件拖动的实现
- Android控件拖动的实现
- Android控件拖动的实现
- 可在屏幕上随意拖动的控件
- Android拖动控件的实现,自定义可拖动的LinearLayout
- 如何实现android控件的拖动效果
- Android实现控件拖动的小Demo
- Android:全屏幕拖动控件的实现
- Android 控件 拖动
- 遇到 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo异常的一种特殊情况
- 数据结构与算法(13)冒泡排序
- Python中中文乱码问题
- java中的递归调用算法
- Java时间类Date全解析
- Android-满屏幕拖动的控件
- Android DIY之路 (四)拖拽替换,一个view发送其他所有view绑定即可监听到。
- 插入排序
- Ionic 列表
- SpringMVC中AcceptHeaderLocaleResolver分析
- 四种引流的方式
- 透明QT界面
- final关键字
- IO:输入输出