Android View汇总篇:View基础(一)

1.前言

View 官网
Provides classes that expose basic user interface classes that handle screen layout and interaction with the user.
Android 应用中的所有用户界面元素都是使用 ViewViewGroup 对象构建而成。 View 对象用于在屏幕上绘制可供用户交互的内容。ViewGroup 对象用于储存其他 ViewViewGroup对象,以便定义界面的布局。

2.View 相关知识

view基础

2.1 View/ViewGroup View树结构

在窗口中所有View都是单根继承的。你可以通过code或者XML文件来添加View。我们有许多的View的子类来用来显示和控制文本,图像或者其他的内容。

View架构:View是一种界面层的空间的一种抽象,它代表了一个控件,
除了View,还有ViewGroup,ViewGroup也继承了View,这就意味着View
本身可以是单个控件也可以是多个控件组成的一组控件。

// 
public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {

}
// ViewGroup 继承View
public abstract class ViewGroup extends View {

}
视图层次结构

2.2 Android UI视图架构

在每一个Activity中都包含了一个Window,而这个Window通常上是由PhoneWindow实现的,而PhoneWindow又将DecorView设置为整个界面的根布局,DecorView作为根布局将要显示的具体内容呈现在PhoneWindow上,并提供了一些通用方法来操作界面。这里所有View的交互事件都由WindowManagerService(WMS)进行接收,并通过Activity回调相应的onClickListener。

Activity 页面

2.3.Android坐标系与视图坐标系

在Android的世界中我们最常用到的就是Android坐标系和视图坐标系了。对于一个控件而言,它在Android坐标系中的位置我们可以称之为:绝对坐标系;而在视图坐标系中,指示的就是它的相对位置了。

android 坐标系

Android系统中为我们提供了getLocationOnScreen(int[] location)方法来获取控件在整个屏幕的绝对坐标,此时要注意的是:该坐标是从屏幕的左上角(原点)开始获取的,所以也包括了状态栏的高度

view 视图坐标系

View自身的相对坐标
通过如下方法可以获得View到其父控件(ViewGroup)的距离:

方法 解释
getTop() 获取View自身顶边到其父布局顶边的距离
getLeft() 获取View自身左边到其父布局左边的距离
getRight() 获取View自身右边到其父布局左边的距离
getBottom() 获取View自身底边到其父布局顶边的距离
getX() 返回值为getLeft()+getTranslationX(),当setTranslationX()时getLeft()不变,getX()变。
getY() 返回值为getTop()+getTranslationY(),当setTranslationY()时getTop()不变,getY()变。

MotionEvent提供的方法
我们看上图那个触摸点,我们知道无论是View还是ViewGroup,最终的点击事件都会由onTouchEvent(MotionEvent event)方法来处理,MotionEvent也提供了各种获取焦点坐标的方法:

方法 解释
getX() 获取点击事件距离控件左边的距离,即视图坐标
getY() 获取点击事件距离控件顶边的距离,即视图坐标
getRawX() 获取点击事件距离整个屏幕左边距离,即绝对坐标
getRawY() 获取点击事件距离整个屏幕顶边的的距离,即绝对坐标

2.4.View的移动

1.View.scrollTo(x,y)\View.ScrollBy(x,y):内部也是调用scrollTo
2.属性动画实现:

3.位移动画:
TranslateAnimation anim = new TranslateAnimation(0, 500, 0, 500);
        anim.setFillAfter(true);
        anim.setDuration(2 * 1000);
        button.startAnimation(anim);

4. setLayoutParams实现
5. layout实现
6. offsetLeftAndRight,offsetTopAndBottom


scrollTo,scrollBy:操作简单,适合对View内容的滑动;
view内容的点击事件,也会跟随相应滑动。

动画:操作简单,属性动画:也是很好的移动方案,移动之后,
x、y的值改变了,但是left、top、right、bottom值没有改变。 
(在不考虑兼容3.0以下的版本情况下);

平移动画:主要适用于没有交互View和实现复杂的动画效果。

改变布局参数:setLayoutParams,layout,
offsetLeftAndRight,offsetTopAndBottom 适用于有交互的View。因为他们是完全移动地 View。
View的x、y、left、top、right、bottom都会相应的增加对应的px。

关于Android View的scrollBy()和scrollTo()参数传递正数却向坐标系负方向移动的特性可能很多人都有疑惑,甚至是死记结论,这里我们简单给出产生这种特性的真实原因—-源码分析,如下:

public void scrollTo(int x, int y) {
    if (mScrollX != x || mScrollY != y) {
        int oldX = mScrollX;
        int oldY = mScrollY;
        mScrollX = x;
        mScrollY = y;
        invalidateParentCaches();
        onScrollChanged(mScrollX, mScrollY, oldX, oldY);
        if (!awakenScrollBars()) {
        postInvalidateOnAnimation();
        }
    }
}

1.调用View.scrollTo(),会触发View的onScrollChanged(int, int, int, int)} and the view will be invalidated.
2.
 public void invalidate(int l, int t, int r, int b) {
        final int scrollX = mScrollX;
        final int scrollY = mScrollY;
        //真正原因就是这里 如果正 那么值是负的方向刚好相反~
        invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false);
    }

2.5.参考文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容