Android-满屏幕拖动的控件

本文转载自师兄一篇博客:http://blog.csdn.net/yayun0516/article/details/52254818

觉得跟之前的模拟小火箭很相似,又有学习的地方,能作为知识补充。所以转载一起学习。大家也可以关注他的文章哦。

也就是,用户可以随心所欲的拖动控件,布局文件很简单就是一个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方法也是控件交互经常会用到的方法,这方面要很熟悉。

希望这个简单的实例可以给大家带来思维的碰撞。

时间: 2024-10-10 23:44:52

Android-满屏幕拖动的控件的相关文章

Android动态屏幕适配设置控件宽高等属性

了解作者更多 // -------- start genLayoutParams //设置默认屏幕宽高,也就是你们UI设计师设置图纸的模板手机 public static int mCommonHeight = 1920; public static int mCommonWidth = 1080; public static int NO_PARAMS = -1001;//给定一默认不设置参数标志 //只指定宽高 public static void genLayoutParams(Conte

【Android 初学】3、控件布局初步

什么是控件布局 所谓的控件布局方法,就是指控制控件在Activity当中的位置.大小.颜色以及其他控件样式属性的方法. 控件的布局,在android中,有两种方法: 1.使用布局文件完成控件布局(相对简单) 2.在Java代码中完成控件布局(动态布局.更灵活.也相对复杂) 布局方法分类 1.Linear Layout(最容易掌握) 线性布局:可以纵向布局.也可以横向布局. 2.Ralative Layout(最常用使用.熟悉WEB开发的人就很熟悉) 3.ListView 4.Grid View

SeekBar拖动条控件

SeekBar拖动条控件 一.简介 1. 二.SeekBar拖动条控件使用方法 1.创建SeekBar控件 <SeekBar android:id="@+id/SeekBar1" android:layout_width="match_parent" android:layout_height="wrap_content" android:progress="30" /> 2.添加setOnSeekBarChang

android中常用的小控件------Widgets的使用

好久没有写博客了,都不知博客怎么写了,最近突然想写博客,以帮助更多的人,却又不知道写什么好呢? 好吧  我承认我有点懒惰了,可是程序猿是不应该懒惰的哦,俺要做个好孩子. 好了言归正传,开始介绍下今天的主要内容吧! Widgets一个桌面的小控件    个人认为是很常用的,不知道大神们是不是这么觉得的呢?比如说你开发的一款音乐播放器的软件,可把基本的上一曲和下一曲.暂停的几个功能放在这个小控件里面将它显示在桌面上来,这样就很方便啦,你想要下一曲.上一曲.暂停播放的时候,就不用再打开播放器了,而是直

【Android 初学】5、控件--ImageView的使用方法

Start Android 1.图片视图(ImageView)的基本概念 2.<InameView/>与ImageView 3.神奇的ScaleType属性 当图片大小与ImageView大小不匹配的时候,可以通过该属性来调整图片与ImageView控件的位置关系. android:scaleType:  android:scaleType是控制图片如何resized/moved来匹对ImageView的size. ImageView.ScaleType / android:scaleType

Android在onCreate()中获得控件尺寸

@Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        final ImageView imageView = (ImageView) findViewById(R.id.imageview);              int w = View.Mea

3、如何实现拖动PictureBox控件

C#中如何实现拖动PictureBox控件 思路是这样的.得有三个变量.记录x坐标: int xPos;记录y坐标: int yPos;记录是否按下鼠标: bool MoveFlag; //在picturebox的鼠标按下事件里,记录三个变量.private void picBox_MouseDown(object sender, MouseEventArgs e){    MoveFlag = true;//已经按下.    xPos = e.X;//当前x坐标.    yPos = e.Y;

Android高效率编码-细节,控件,架包,功能,工具,开源汇总,你想要的这里都有

Android高效率编码-细节,控件.架包,功能.工具,开源汇总 事实上写博客的初衷也并非说什么分享技术,毕竟咱还仅仅是个小程序猿.最大的目的就是对自我的知识积累.以后万一编码的时候断片了,也能够翻出来看看,这样子对自己也有优点,所以今天就汇总一下一些须要的东西.多图来了,加油! 一.游戏 小熊打字,我刚接触电脑练习打字的时候用到的 下载地址:http://download.csdn.net/detail/qq_26787115/9365721 二.色彩 这张颜色表上的颜色都太赞了 三.控件 1

Android 开源组件 ----- Android LoopView无限自动轮转控件

Android 开源组件 ----- Android LoopView无限自动轮转控件 2015-12-28 15:26 by 杰瑞教育, 32 阅读, 0 评论, 收藏, 编辑 一.组件介绍 App产品中信息列表头部都会有自动轮转的广告图片,使用ViewPager可以实现但编码比较麻烦,我们可以采用使用LoopView开源控件来完成, LoopView是一个强大的轮转大图控件,并且提供了许多配置方法足以满足你的应用需求 二.环境配置 如果您的项目使用 Gradle 构建, 只需要在您的buil