热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android  View移动的六种方法小结

在android开发中,经常会遇到一个view需要它能够支持滑动的需求。下面通过本篇文章给大家介绍androidview移动的六种方法,对androidview移动相关知识感兴趣的朋友一起学习吧

在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() 等函数

     来获取其位置信息.


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
author-avatar
手机用户2502856203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有