Android View相关摘抄

Android  小知识  2023年6月24日 am9:51发布1年前 (2023)更新 城堡大人
158 0 0

前言

介绍Android的View的相关知识(主要来自《Android进阶之光》),之前记录的,附在这里方便自己查询。

正文

View的继承关系

ViewGroup作为View或者ViewGroup这些组件的容器, 派生了多种布局控件子类, 比如LinearLayout、 RelativeLayout等。

Android View相关摘抄

坐标相关

Android系统中有两种坐标系, 分别为Android坐标系和View坐标系。

Android坐标

在Android中, 以屏幕左上角的顶点作为Android原点, 向右是X轴正方向, 向下是Y 轴正方向。

在触控事件中, 可用getRawX() 和getRawY() 方法获得的对应点的Android坐标。

View的坐标

除了Android坐标系, 还有一个坐标系: View坐标系, 它与Android坐标系并不冲突, 两者是共同存在 的, 它们一起来帮助开发者更好地控制View。

Android View相关摘抄

子View相对于父布局
  1. getTop() : 获取View自身顶边到其父布局顶边的距离。

  2. getLeft() : 获取View自身左边到其父布局左边的距离。

  3. getRight() : 获取View自身右边到其父布局左边的距离。

  4. getBottom() : 获取View自身底边到其父布局顶边的距离。

计算View的宽和高

float width  = getRight() - getLeft();
float height = getBottom() - getTop();
子View的点击坐标

通过MotionEvent获取相对于整个屏幕或父布局的点击坐标。

  1. getX() : 获取点击事件距离控件左边的距离, 即视图坐标。

  2. getY() : 获取点击事件距离控件顶边的距离, 即视图坐标。

  3. getRawX() : 获取点击事件距离整个屏幕左边的距离, 即绝对坐标。

  4. getRawY() : 获取点击事件距离整个屏幕顶边的距离, 即绝对坐标。

View的滑动

实现View滑动有很多种方法, 在这里主要讲解6种滑动方法, 分别是layout() 、 offsetLeftAndRight() 与 offsetTopAndBottom() 、 LayoutParams、 动画、 scollTo 与 scollBy, 以及Scroller 。

layout()

思路: 记录ACTION_DOWN时的downX和downY位置,然后ACTION_MOVE时计算偏移量并通过layout()进行滑动View。

# ACTION_MOVE
int offsetX = event.getX() - downX;
int offsetY = event.getY() - downY;
//利用layout的方法进行重新刷新
layout(getLeft()+ offsetX, getTop+offsetY, getRight()+offsetX, getBottom()+offsetY);
offsetLeftAndRight() 与offsetTopAndBottom()

跟Layout()差不多

# ACTION_MOVE
# 部分代码略
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);
改变LayoutParams参数

这个比较常用,也比较简单,也就是通过改变布局参数,重新刷新。

这里以父布局为LinearLayout为例,

# 下面是获取LayoutParams的一种方式
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)getLayoutParams();

lp.leftMargin = getLeft() + offsetX;
lp.topMargin = getTop() + offsetY;

setLayoutParams(lp);

当然,还可以哟个ViewGroup.MarginLayoutParams

ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)getLayoutParams();

lp.leftMargin = getLeft() + offsetX;
lp.topMargin = getTop() + offsetY;

setLayoutParams(lp);
动画

动画移动。

  1. 补间动画的平移

  2. 属性动画

scrollTo和scrollBy

scrollTo(x, y) 表示移动到一个具体的坐标点, 而scrollBy(dx, dy) 则表示移动的增量为dx、 dy。 其中, scollBy最终也是要调用scollTo的。

scollTo、 scollBy移动的是View的内容, 如果在ViewGroup中使用, 则是移动其所有的子View。 我们将 ACTION_MOVE中的代码替换成如下代码:

((View)getParent()).scrollBy(-offsetX,-offsetY);  
Scroller

在用scollTo/scollBy方法进行滑动时, 这个过程是瞬间完成的, 所以用户体验不大好。 这里我们可以使用 Scroller 来实现有过渡效果的滑动, 这个过程不是瞬间完成的, 而是在一定的时间间隔内完成的。

Android View相关摘抄

参考文章

1.《Android进阶之光》

 历史上的今天

  1. 2024: 李娟:属于我的马(0条评论)
  2. 2022: Java Consumer的使用(0条评论)
  3. 2021: [ijkplayer专题]编译ijkplayer时出现Failed to create toolchain(0条评论)
  4. 2021: 余秀华:一潭水(0条评论)
  5. 2020: [摘]BAT脚本如何自动执行 adb shell 以后的命令(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

JNI动态注册

前言之前其实写过,代码不见了,为了走一下流程,重新简单的写了一个。正文动态注册动态注册java的Native方法,使得c/c++方法名可以和java的Native方法名可以不同。动态注册是将二者方法名关联起来,以后在修改Native方法名时,只需修改动态注册关联的方法名称即可。优点:...

AsyncTask源码分析

AsyncTask源码分析,当前使用的Android 6.0的代码,AsyncTask源码目录在如下:base\core\java\android\os\AsyncTask.java在分析源码之前,我们看看我们在项目中是如何使用AsyncTask的。下面是个简单的demo,只是写了AsyncT...

Fragment生命周期的详情

最近在看Android 6.0 Settings的源码,Fragment在很多地方都在使用,因此今天有空就复习一下。一图胜千言,直接看图。(下图来源互联网)图1、Fragment图2、Activity上面是Fragment和Activity(这个很熟悉吧)各自的生命周期,他们有些相同之处...

顾城:墓床

我知道永逝降临,并不悲伤松林中安放着我的愿望下边有海,远看像水池一点点跟我的是下午的阳光 人时已尽,人世很长我在中间应当休息走过的人说树枝低了走过的人说树枝在长

裴多菲:我愿意是激流

我愿意是急流,山里的小河,在崎岖的路上、岩石上经过......只要我的爱人是一条小鱼,在我的浪花中快乐地游來游去我愿意是荒林,在河流的兩岸对一阵阵的狂风,勇敢地作战......只要我的爱人是一只小鸟在我的稠密的树枝间做窠、 鸣叫我愿意是废墟,在峻峭的山岩上這静默的毁灭并不使我懊丧....

Ubuntu16.04搭建LAMP架构服务器笔记

这是在自己电脑上搭建的LAMP环境自己开发和练习使用,在这里总记录一下1、安装Apache2sudo apt-get install apache2PS:这里会生产服务器根目录/var/www/,我们可以改变到自己想要的目录下方法一:修改配置文件sudo vim /etc/apa...