Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android 图形基础类Rect,扎实基础助腾飞

$
0
0

转载请注明出处:王亟亟的大牛之路

上周把“垃圾桶动画写完了”,然后这礼拜寻思着学习点啥,脑子闷逼了大半天,然后就找了点基础源码读读,把看的经历分享给大家。

先安利:https://github.com/ddwhan0123/Useful-Open-Source-Android 希望能找到你想要的


Rect

这是一个我们常用的一个“绘画相关的工具类”,常用语描述长方形/正方形,他只有4个属性

    public int left;
    public int top;
    public int right;
    public int bottom;

这4个属性描述着这一个“方块”,但是这有一个知识点需要理清楚,先看这张图

这里写图片描述

本Rect最左侧到屏幕的左侧的距离是 left
本Rect最上面到屏幕上方的距离是 top
本Rect最右侧到屏幕左侧的距离是 right
本Rect最下面到屏幕上方的距离是 bottom

这四个属性不单单描述了这个 长方形4个点的坐标,间接的描述出这个长方形的尺寸

长 = bottom-top
宽 = right-left

这部分的知识可以看:http://stackoverflow.com/questions/22589322/what-does-top-left-right-and-bottom-mean-in-android-rect-object


构造函数

public Rect() {}

public Rect(int left, int top, int right, int bottom) {
        this.left = left;
        this.top = top;
        this.right = right;
        this.bottom = bottom;
    }

 public Rect(Rect r) {
        if (r == null) {
            left = top = right = bottom = 0;
        } else {
            left = r.left;
            top = r.top;
            right = r.right;
            bottom = r.bottom;
        }
    }

3个构造函数都是围绕着初始化这4个属性来做的,无论是传过来一个新Rect对象,还是传入具体的尺寸。


父类的实现

因为实现了Parcelable 所以需要实现一堆Object的方法,诸如equals,toString等等,我们来简单看一看

  @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Rect r = (Rect) o;
        return left == r.left && top == r.top && right == r.right && bottom == r.bottom;
    }

首先先对传来的对象进行 判空,类型判断,再强转成Rect对象,最后还是一个个去比对那4个属性了。

 @Override
    public String toString() {
        StringBuilder sb = new StringBuilder(32);
        sb.append("Rect("); sb.append(left); sb.append(", ");
        sb.append(top); sb.append(" - "); sb.append(right);
        sb.append(", "); sb.append(bottom); sb.append(")");
        return sb.toString();
    }

返回 Rect(left,top,right,bottom)


常用的那些方法

获取“宽”

    //文章开头说的公式在这里得到了应验
    public final int width() {
        return right - left;
    }

获取“高”

 public final int height() {
        return bottom - top;
    }

有效性的判断

//因为left是最左侧,right比left还小不就不成形了么?
宽高同是如此
public final boolean isEmpty() {
        return left >= right || top >= bottom;
    }

全部置0操作

 public void setEmpty() {
        left = right = top = bottom = 0;
    }

设置参数方法,和构造函数的区别仅在于不会创建新对象

  public void set(int left, int top, int right, int bottom) {
        this.left = left;
        this.top = top;
        this.right = right;
        this.bottom = bottom;
    }

整体实现不是很复杂,就是为了形容描绘,实现一个 “长方形”的概念。

这就是面向对象的魅力!!

作者:ddwhan0123 发表于2016/12/26 15:05:10 原文链接
阅读:94 评论:1 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles