View的自动移动,我们可以设置动画,如之类提到的 ViewCompat,Animation。

如何是View随着手指的移动而移动呢?

在onTouch事件实现

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            moveView(view, event.getRawX(), event.getRawY());
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}

说明:

onTouch(View view,MotionEvent event)这个方法中,

getRawX()和getRawY()获得的是相对屏幕的位置,

getX()和getY()获得的永远是view的触摸位置坐标(这两个值不会超过view的长度和宽度)。

如是Activity中的 onTouchEvent(MotionEvent event) 方法,这个时候获得的是屏幕点击位置的坐标。getRawX()与getX()访求获取的值是一样的。

方法1:setLayoutParams

/**

* 设置View的布局属性,使得view随着手指移动 注意:view所在的布局必须使用RelativeLayout 而且不得设置居中等样式

*/

private void moveView(View view, float rawX, float rawY) {
    RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view
            .getLayoutParams();
    params.leftMargin = (int) rawX - ivMove.getWidth() / 2;
    params.topMargin = (int) rawY - topTitleHeight - ivMove.getHeight() / 2;
    view.setLayoutParams(params);
}

方法2:view.layout(l,t,r,b)

/**
 * 通过layout方法,移动view 
 * 优点:对view所在的布局,要求不苛刻,不要是RelativeLayout,而且可以修改view的大小
 */
private void moveViewByLayout(View view, int rawX, int rawY) {
    int left = rawX - ivMove.getWidth() / 2;
    int top = rawY - topTitleHeight - ivMove.getHeight() / 2;
    int width = left + view.getWidth();
    int height = top + view.getHeight();
    view.layout(left, top, width, height);
}

方法3:ScrollBy()或者ScrollTo();

/**

* 在activity中实现
 * scrollBy() 相对于当前的坐标进行偏移
 * scrollTo() 相对于屏幕的左上角进行偏移
 * @param event
 */
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()){
        case MotionEvent.ACTION_DOWN:
            currentX= (int) event.getX();
            currentY= (int) event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            int x2= (int) event.getX();
            int y2= (int) event.getY();
            container.scrollBy(currentX - x2, currentY - y2);
            currentY=y2;
            currentX=x2;
            xyValue.setText(x2+","+y2);
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}

Android:View随手指移动的更多相关文章

  1. Android 拖动View View跟随手指一动

    /** * 拖动View 配合onTouchListener使用 * 设置View的布局属性,使得view随着手指移动 注意:view所在的布局必须使用RelativeLayout 而且不得设置居中等 ...

  2. Android View视图系统分析和Scroller和OverScroller分析

    Android  View视图系统分析和Scroller和OverScroller分析 View  视图分析         首先,我们知道.在Android中全部的视图资源(无论是Layout还是V ...

  3. android view事件分发机制

    首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志 ...

  4. Android View的滑动

    Android View的滑动 文章目录 Android View的滑动 一.实现移动 1.1 layout() 1.2 设置位置偏移量 1.3 改变布局参数 1.4 动画 1.5 ScrollTo以 ...

  5. Android View 的事件分发原理解析

    作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...

  6. Android View的事件分发机制

    准备了一阵子,一直想写一篇事件分发的文章总结一下.这个知识点实在是太重要了. 一个应用的布局是丰富的,有TextView,ImageView,Button等.这些子View的外层还有ViewGroup ...

  7. 谈谈我对Android View事件分发的理解

    写这篇博客的缘由.近期因为项目中用到相似一个LinearLayout中水平布局中,有一个TextView和Button,然后对该LinearLayout布局设置点击事件.点击TextView能够触发该 ...

  8. Android开发——跟随手指的小球实现

      今天要实现的是一个跟随手指的小球,说白了就是让小球按着手指滑动的轨迹运动,实现起来还是比较容易的. 用到的类是drawView,我们先自定义一个DrawView组件. DrawView.java: ...

  9. 结合源码,重温 Android View 的事件处理知多少 ?

    前言 Android View 的 事件处理在我们的编程中,可谓是无处不在了.但对于大多数人而言,一直都是简单的使用,对其原理缺乏深入地认识. 学 Android 有一段时间了,最近发现,很多基础知识 ...

随机推荐

  1. 《Invert》开发日志01:核心玩法设计

    前面提过,这个游戏的核心玩法基于我做的第一个Unity游戏,名字就叫<Invert>,现在在应用宝上面还能搜到.不过那个游戏也不是我原创的,它的玩法设计来自github上的一个开源项目(h ...

  2. 第15章 设备无关位图_15.3 DIB和DDB的结合

    第15章 设备相关位图_15.3 DIB和DDB的结合 15.3.1 从DIB创建DDB (1)hBitmap =CreateDIBitmap(…)——注意这名称会误导,实际上创建的是DDB 参数 说 ...

  3. python 使用pip安装第三方模块

    part 1:使用方法: 1.pip install somePackage picture 1 2.pip show somePackage 例如:pip show pip 弹出关于该模块的信息 p ...

  4. 关于OAUTH2.0的极品好文

    Web Server Flow: web ServerFlow是把oauth1.0的三个步骤缩略为两个步骤 首先这个是适合有server的第三方使用的. 1客户端http请求authorize 2服务 ...

  5. JavaScript(DOM操作)(Window.document对象)

    一.找到元素: docunment.getElementById("id"):                      根据id找,最多找一个: var a =docunment ...

  6. [No000045]最好的休息,不是睡觉!

    导读 有人曾说,累,一定是你打开生活的方式不对.细细揣摩,很有道理,在这个世上,从来都是微笑不累,生气累:单纯不累,复杂累:相思不累,单恋累:相守不累,独守累:相爱不累,相残累:专情不累,滥情累:友情 ...

  7. javascript获取元素的方法[xyyit]

    1. javascript默认的方法: <div id=”div_id” class=”div_class” name=”div_name”></div> //1. 根据id ...

  8. Android 下载网络图片保存到本地

    通过网络地址获取网络图片,点击下载将图片显示出来,然后点击图片将图片保存到本地. 首先需要在manifest上添加一些权限: <!-- 访问网络的权限 --> <uses-permi ...

  9. 在ASP.NET中如何运行后台任务

    from:https://blogs.msdn.microsoft.com/scott_hanselman/2014/12/21/asp-net/ [原文发表地址] How to run Backgr ...

  10. apt-get update更新源时,出现“Hash Sum mismatch”问题

    当使用apt-get update更新源时,出现下面"Hash Sum mismatch"的报错,具体如下:root@localhost:~# apt-get update.... ...