1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.graphics; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 24 /** 25 * An Insets instance holds four integer offsets which describe changes to the four 26 * edges of a Rectangle. By convention, positive values move edges towards the 27 * centre of the rectangle. 28 * <p> 29 * Insets are immutable so may be treated as values. 30 * 31 */ 32 public final class Insets implements Parcelable { 33 public static final @NonNull Insets NONE = new Insets(0, 0, 0, 0); 34 35 public final int left; 36 public final int top; 37 public final int right; 38 public final int bottom; 39 Insets(int left, int top, int right, int bottom)40 private Insets(int left, int top, int right, int bottom) { 41 this.left = left; 42 this.top = top; 43 this.right = right; 44 this.bottom = bottom; 45 } 46 47 // Factory methods 48 49 /** 50 * Return an Insets instance with the appropriate values. 51 * 52 * @param left the left inset 53 * @param top the top inset 54 * @param right the right inset 55 * @param bottom the bottom inset 56 * 57 * @return Insets instance with the appropriate values 58 */ of(int left, int top, int right, int bottom)59 public static @NonNull Insets of(int left, int top, int right, int bottom) { 60 if (left == 0 && top == 0 && right == 0 && bottom == 0) { 61 return NONE; 62 } 63 return new Insets(left, top, right, bottom); 64 } 65 66 /** 67 * Return an Insets instance with the appropriate values. 68 * 69 * @param r the rectangle from which to take the values 70 * 71 * @return an Insets instance with the appropriate values 72 */ of(@ullable Rect r)73 public static @NonNull Insets of(@Nullable Rect r) { 74 return (r == null) ? NONE : of(r.left, r.top, r.right, r.bottom); 75 } 76 77 /** 78 * Returns a Rect instance with the appropriate values. 79 * 80 * @hide 81 */ toRect()82 public @NonNull Rect toRect() { 83 return new Rect(left, top, right, bottom); 84 } 85 86 /** 87 * Add two Insets. 88 * 89 * @param a The first Insets to add. 90 * @param b The second Insets to add. 91 * @return a + b, i. e. all insets on every side are added together. 92 */ add(@onNull Insets a, @NonNull Insets b)93 public static @NonNull Insets add(@NonNull Insets a, @NonNull Insets b) { 94 return Insets.of(a.left + b.left, a.top + b.top, a.right + b.right, a.bottom + b.bottom); 95 } 96 97 /** 98 * Subtract two Insets. 99 * 100 * @param a The minuend. 101 * @param b The subtrahend. 102 * @return a - b, i. e. all insets on every side are subtracted from each other. 103 */ subtract(@onNull Insets a, @NonNull Insets b)104 public static @NonNull Insets subtract(@NonNull Insets a, @NonNull Insets b) { 105 return Insets.of(a.left - b.left, a.top - b.top, a.right - b.right, a.bottom - b.bottom); 106 } 107 108 /** 109 * Retrieves the maximum of two Insets. 110 * 111 * @param a The first Insets. 112 * @param b The second Insets. 113 * @return max(a, b), i. e. the larger of every inset on every side is taken for the result. 114 */ max(@onNull Insets a, @NonNull Insets b)115 public static @NonNull Insets max(@NonNull Insets a, @NonNull Insets b) { 116 return Insets.of(Math.max(a.left, b.left), Math.max(a.top, b.top), 117 Math.max(a.right, b.right), Math.max(a.bottom, b.bottom)); 118 } 119 120 /** 121 * Retrieves the minimum of two Insets. 122 * 123 * @param a The first Insets. 124 * @param b The second Insets. 125 * @return min(a, b), i. e. the smaller of every inset on every side is taken for the result. 126 */ min(@onNull Insets a, @NonNull Insets b)127 public static @NonNull Insets min(@NonNull Insets a, @NonNull Insets b) { 128 return Insets.of(Math.min(a.left, b.left), Math.min(a.top, b.top), 129 Math.min(a.right, b.right), Math.min(a.bottom, b.bottom)); 130 } 131 132 /** 133 * Two Insets instances are equal iff they belong to the same class and their fields are 134 * pairwise equal. 135 * 136 * @param o the object to compare this instance with. 137 * 138 * @return true iff this object is equal {@code o} 139 */ 140 @Override equals(Object o)141 public boolean equals(Object o) { 142 if (this == o) return true; 143 if (o == null || getClass() != o.getClass()) return false; 144 145 Insets insets = (Insets) o; 146 147 if (bottom != insets.bottom) return false; 148 if (left != insets.left) return false; 149 if (right != insets.right) return false; 150 if (top != insets.top) return false; 151 152 return true; 153 } 154 155 @Override hashCode()156 public int hashCode() { 157 int result = left; 158 result = 31 * result + top; 159 result = 31 * result + right; 160 result = 31 * result + bottom; 161 return result; 162 } 163 164 @Override toString()165 public String toString() { 166 return "Insets{" + 167 "left=" + left + 168 ", top=" + top + 169 ", right=" + right + 170 ", bottom=" + bottom + 171 '}'; 172 } 173 174 @Override describeContents()175 public int describeContents() { 176 return 0; 177 } 178 179 @Override writeToParcel(Parcel out, int flags)180 public void writeToParcel(Parcel out, int flags) { 181 out.writeInt(left); 182 out.writeInt(top); 183 out.writeInt(right); 184 out.writeInt(bottom); 185 } 186 187 public static final @android.annotation.NonNull Parcelable.Creator<Insets> CREATOR = new Parcelable.Creator<Insets>() { 188 @Override 189 public Insets createFromParcel(Parcel in) { 190 return new Insets(in.readInt(), in.readInt(), in.readInt(), in.readInt()); 191 } 192 193 @Override 194 public Insets[] newArray(int size) { 195 return new Insets[size]; 196 } 197 }; 198 } 199