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中View创建的全过程

    前言 吸进这几天在看View的尺寸是怎样计算出来的,于是看了整个View被初始化的过程,结合系统源码总结了一下分享出来,方便需要的朋友或者自己以后有需要的时候看看,下面话不多说了,来看看详细的介绍吧. 从布局文件到LayoutParams 首先从Activity的setContentView(int)方法开始,只要设置了R.layout的布局文件,那么界面上就会显示出来对应的内容.所以以这个方法为初发点,然后往后跟踪代码. public void setContentView(@LayoutRe

  • Android动态添加View的问题解决方法

    后台代码 复制代码 代码如下: private void ChangeView()    {        ly.removeAllViews();        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);        View layout = inflater.inflate(R.layout.grid,null);        GridView gridview

  • android开发教程之view组件添加边框示例

    给TextureView添加边框(专业名词为描边),有三种解决方案: 1.设置一个9 patch 的,右边框,中间是空的PNG. 2.自定义一个View,用Canvas画个边框. 3.用Android提供的ShapeDrawable来定义一个边框. 个人比较建议采用第三种方式,原因是因为第三种只要写XML,速度快,占用资源小,代码编写量也少,便于维护. 使用方法如下: 1.定义一个background.xml文件. 复制代码 代码如下: <?xml version="1.0" e

  • Android 自定义View的使用介绍

    在项目开发中,可能系统自带的一些widget不能满足我们的需求,这时就需要自定义View. 通过查看系统中的常用widget如Button,TextView,EditText,他们都继承自View,所以我们在继承自定义View的时候也自然的需要继承View.1.首先新建一个类LView继承自View 复制代码 代码如下: public class LView extends View { private Paint paint; public LView(Context context) {  

  • 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

随机推荐