Android  View移动的六种方法小结

在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍android view移动的六种方法。

layout()

如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果。

public class DragView extends View{
  private int lastX;
  private int lastY;
  public DragView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public boolean onTouchEvent(MotionEvent event) {
    //获取到手指处的横坐标和纵坐标
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
        lastX = x;
        lastY = y;
      break;
      case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offX = x - lastX;
        int offY = y - lastY;
        //调用layout方法来重新放置它的位置
        layout(getLeft()+offX, getTop()+offY,
          getRight()+offX  , getBottom()+offY);
      break;
    }
    return true;
  }
} 

offsetLeftAndRight() offsetTopAndBottom()

其实这两个方法分别是对左右移动和上下移动的封装,传入的就是偏移量。

public boolean onTouchEvent(MotionEvent event) {
    //获取到手指处的横坐标和纵坐标
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
        lastX = x;
        lastY = y;
      break;
      case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offX = x - lastX;
        int offY = y - lastY;
        offsetLeftAndRight(offX);
        offsetTopAndBottom(offY);
      break;
    }
    return true;
  } 

LayoutParams

public boolean onTouchEvent(MotionEvent event) {
    //获取到手指处的横坐标和纵坐标
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
        lastX = x;
        lastY = y;
      break;
      case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offX = x - lastX;
        int offY = y - lastY;
        ViewGroup.MarginLayoutParams mlp =
            (MarginLayoutParams) getLayoutParams();
        mlp.leftMargin = getLeft()+offX;
        mlp.topMargin = getTop()+offY;
        setLayoutParams(mlp);
      break;
    }
    return true;
  }

scrollTo() scrollBy()

sceollTo(x,y)传入的应该是移动的终点坐标

scrollBy(dx,dy)传入的是移动的增量。

通过scrollBy传入的值应该是你需要的那个增量的相反数!

public boolean onTouchEvent(MotionEvent event) {
    //获取到手指处的横坐标和纵坐标
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
        lastX = x;
        lastY = y;
      break;
      case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offX = x - lastX;
        int offY = y - lastY;
        ((View) getParent()).scrollBy(-offX,- offY);
      break;
    }
    return true;
  } 

Scroller

步骤一:

初始化Scroller对象,即mScroller = new Scroller(context)

步骤二:

重写computeScroll()方法,实现模拟滑动。可以复制下面的末模板代码:

public void computeScroll() {
  super.computeScroll();
  if(mScroller.computeScrollOffset()){
    ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
  }
  invalidate();//必须要调用
} 

步骤三:

开启模拟过程,在合适的地方(一般都在move中)startScroll方法。它有两个重载方法如下:

startScroll(int startX,int startY, int dx,int dy,int duration)
startScroll(int startX,int startY,int dx,int dy)

需要说明的是:

1.computeScrollOffset方法用来判断是否完成了整个滑动,返回为true,则说明没有完成,否则则完成滑动。

2.getCurrY()以及getCurrX()获得的是当前的滑动坐标。

3.最后必须要用invalidate方法来刷新。因为computeScroll方法不会自动调用,是在draw方法中被调用的。所以必须使用invalidate刷新,就会调用draw方法,自然就会调用computeScroll方法了。这样子就会实现循环调用。

4.在startScroll中,偏移量跟使用scrollBy方法中的偏移量用法是一样的,即也必须填写你实际想要移动距离的相反数。也就是你实际想让它偏移一个正值,这里就填写它相应的负值,如果想偏移一个负值,这里就填写相应的正值!

public class DragView extends View{
  private int lastX;
  private int lastY;
  private Scroller mScroller;
  public DragView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mScroller = new Scroller(context);
  }
  public boolean onTouchEvent(MotionEvent event) {
    //获取到手指处的横坐标和纵坐标
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch(event.getAction()){
      case MotionEvent.ACTION_DOWN:
        lastX = x;
        lastY = y;
      break;
      case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offX = x - lastX;
        int offY = y - lastY;
        View viewGroup = (View) getParent();
        ((View) getParent()).scrollBy(-offX,- offY);
      break;
    case MotionEvent.ACTION_UP:
      View viewGroup = (View) getParent();
      //开启滑动,让其回到原点
      mScroller.startScroll(viewGroup.getScrollX(),
          viewGroup.getScrollY(),
          -viewGroup.getScrollX() ,-viewGroup.getScrollY());
      break;
    }
    return true;
  }
  public void computeScroll() {
    super.computeScroll();
    if(mScroller.computeScrollOffset()) {
      ((View)getParent()).scrollTo(mScroller.getCurrX(),
            mScroller.getCurrY());
    }
    invalidate();//必须要调用
  }
}

下面给大家介绍android view类

不是对照翻译,只是理解性翻译。 本文只用于个人复习,不保证翻译的准确和正确性。

一 View 的基本概念

1. 基本描述:

这个类是用户接口的基础构件。 View 表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理。

View 是所有widget类的基类,Widget 类用于创建交互式UI构件(按钮,输入框等)。

View 类的ViewGroup子类是layout 的基类,Layout是一个不可见的容器,它保存着View(或ViewGroup)并定义这些View的layout 属性。

可以说View类是用户接口类中最重要的一个类。

2. 使用 view

2.1 View 的组织:

同一个窗口的所用view 都存储在一个树内,既可以通过代码动态增加删除view, 也可以通过在xml文件中定义一个view树来构造这个树。

2.2 . 主要操作:

2.2.1 设置属性:既通过view和其子类的方法设置view的属性, 也可以在xml文件中设置view的属性。

2.2.2 设置焦点:  通过requestFocus 方法可以强制view获得焦点。

2.2.3 设置 listener: 可以通过设置listener来监听 特定view的事件, 比如获得或失去焦点,点击事件等。

2.2.4 设置visibility: 可以隐藏或显示view, setVisibility.

2.3. 注意事项:

Android framework 负责measuring laying out 和drawing view.  除非要自己实现一个ViewGroup,

否则不应该显示调用实现这些功能的方法。

二 实现定制view

为了实现一个定制view, 需要重写一些view的标准方法。

framework会调用这些方法, 并且认为这些方法应该是所有的view都有实现。

这些方法不必全部重写, 事实上,可以只重写onDraw 函数就可以了

三 View的属性和动作:

1 属性:

1.1 IDs: Views 有一个整数相对应, id被用于在view 数中找到指定的view.
     可以在layout 文件中定义 一个唯一的ID, 在Activity 的 onCreate函数中调用findViewById来查找这个view.
     在整个树内, view可以不是唯一的,但再指定的范围内查找时我们可以确信它是唯一的

2.位置:

view是一个矩形区域, 使用左&上的坐标以及长和宽可以表示一个View. 我们可以使用方法getLeft() getTop() getRight() getBottom() getWidth() 等函数

来获取其位置信息.

(0)

相关推荐

  • Android实现拖动小球跟随手指移动效果

    Android拖动小球跟随手指移动Demo,供大家参考,具体内容如下 1.使用的知识点有自定义View,利用Canvas画球: 2.使用触摸时间来操作: 效果图: 代码如下: 1.自定义view: public class DrawView extends View { public float currentX = 50; public float currentY = 50; public DrawView(Context context) { super(context); } publi

  • Android实现循环平移动画示例

    实现用一张背景图做循环从左往右平移动画. 1.实现两个animation xml文件,一个起始位置在-100%p ,一个在0%p.设置repeat属性为循环,重复. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolato

  • Android自定义圆形View实现小球跟随手指移动效果

    本文实例为大家分享了Android实现小球跟随手指移动效果的具体代码,供大家参考,具体内容如下 一. 需求功能 手指在屏幕上滑动,红色的小球始终跟随手指移动. 实现的思路: 1)自定义View,在onDraw中画圆作为小球: 2)重写自定义View的onTouchEvent方法,记录触屏坐标,用新的坐标重新绘制小球: 3)在布局中引用自定义View布局,运行程序,实现跟随手指移动效果. 关键技术点 自定义View应用.触摸事件处理.canvas绘图.Paint应用. 实现步骤 1. 新建一个工程

  • Android实现移动小球和CircularReveal页面切换动画实例代码

    前言 本文主要给大家介绍了关于Android如何实现移动小球和CircularReveal页面切换动画的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 效果图如下 是在fragment中跳转activity实现的效果,fragment跳fragment,activity跳activity类似~~ 实现过程 重写FloatingActionButton的onTouchListener()方法,使小球可以移动,并判断边界 点击fab时记录坐标传到下一个页面,在下一个页面展

  • android实现关闭或开启移动网络数据

    如下所示: 复制代码 代码如下: //android关闭或开启移动网络数据(关闭后,设备不可以上网,但可以打电话和发短信)       public void setMobileDataEnabled(boolean enabled)     {        ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);        cm.setMobileDataEn

  • js判断客户端是iOS还是Android等移动终端的方法

    判断原理: JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的.在许多情况下,值判断出浏览器类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道. 浏览器类型 ⑴浏览器特有属性 ⑵根据userAgent 浏览器版本 ⑴根据userAge

  • Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: 复制代码 代码如下: /**  * 使用矩阵控制图片移动.缩放.旋转  */  public class CommonImgEffectView extends View { private Context context ;      private Bitmap mainBmp , controlBmp ;      private int mainBmpWidth , mainBmpHeight , c

  • Android自定义控件实现随手指移动的小球

    一个关于自定义控件的小Demo,随着手指移动的小球. 先看下效果图: 实现代码如下: 1.自定义控件类 package com.dc.customview.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import

  • Android View移动的六种方法小结

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求.下面通过本篇文章给大家介绍android view移动的六种方法. layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView extends View{ private int lastX; private int lastY; public DragView(Context cont

  • Android  View移动的六种方法小结

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求.下面通过本篇文章给大家介绍android view移动的六种方法. layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView extends View{ private int lastX; private int lastY; public DragView(Context cont

  • Android中闪屏实现方法小结(普通闪屏、倒计时闪屏、倒计时+动画闪屏)

    一.项目目录结构 二.activity_main.xml代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match

  • Android TextView字体颜色设置方法小结

    本文实例总结了Android TextView字体颜色设置方法.分享给大家供大家参考,具体如下: 对于setTextView(int a)这里的a是传进去颜色的值.例如,红色0xff0000是指0xff0000如何直接传入R.color.red是没有办法设置颜色的,只有通过文章中的第三种方法先拿到资源的颜色值再传进去. tv.setTextColor(this.getResources().getColor(R.color.red)); 关键字: android textview color T

  • Android中使用Alarm的方法小结

    前言 在Android中,通过AlarmManager我们可以设置一些闹钟.在一些指定的时间点启动我们的服务进行处理事件. 例如每隔几小时拉取一下网络数据,或者每天8点钟提醒用户等. 而在使用AlarmManager时,注意以下几个点将会帮助你更好的使用这个特性. 触发时间增加随机性 如果设置闹钟所触发的任务中包含网络请求时,建议为这个触发时间点增加随机性. 假设设定在早上8点发起查询天气预报的网络请求,不增加随机性.那么在8点这一时刻,服务器将会收到大量的请求,造成服务器压力过大,如果设备足够

  • php 调用远程url的六种方法小结

    示例代码1: 用file_get_contents 以get方式获取内容 复制代码 代码如下: <?php $url='http://www.baidu.com/'; $html=file_get_contents($url); //print_r($http_response_header); ec($html); printhr(); printarr($http_response_header); printhr(); ?> 示例代码2: 用fopen打开url, 以get方式获取内容

  • Android编程实现长按弹出选项框View进行操作的方法

    本文实例讲述了Android编程实现长按弹出选项框View进行操作的方法.分享给大家供大家参考,具体如下: 长按弹出选项框View进行操作 主要代码解释 private void showPopWindows(View v) { /** pop view */ View mPopView = LayoutInflater.from(this).inflate(R.layout.popup, null); final PopupWindow mPopWindow = new PopupWindow

  • Android实现单页面浮层可拖动view的一种方法

    上一篇讲到通过通过goolge官方的ViewDragHelper工具实现拖动的方法(上一篇见http://www.jb51.net/article/125481.htm),那么有一个问题就是在DragframeLayout中的onTouchEvent一直接收不到触摸消息,而且在onInterceptTouchEvent的时候,并没有触发ViewDragHelper.tryCaptureView方法,因此诞生了另一种比较原始的方法:通过自定义可拖动view来实现 主要方法: initEdge:设置

  • Android View.onMeasure方法详解及实例

    Android View.onMeasure方法详解及实例 View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1.什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,"你想要用多大地方啊?",然后传入两个参数--widthMeasureSpec和heightMeasureSpec. 这两个参数指明控件可获得的空间以及关于这个空间描述的元数据. 更好的方法是你传递View的高度和宽度到setMeasuredDi

  • Android编程中延后处理事件的方法小结

    本文实例讲述了Android编程中延后处理事件的方法.分享给大家供大家参考,具体如下: 一.Handler和TimerTask相结合 1.首先定义TimerTask TimerTask task = new TimerTask(){ public void run() { Message message = new Message(); message.what = 1; handler.sendMessage(message); } }; 2.定义Handler Handler handler

随机推荐