ViewConfiguration.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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 17package android.view; 18 19import android.content.Context; 20import android.util.DisplayMetrics; 21import android.util.SparseArray; 22 23/** 24 * Contains methods to standard constants used in the UI for timeouts, sizes, and distances. 25 */ 26public class ViewConfiguration { 27 /** 28 * Defines the width of the horizontal scrollbar and the height of the vertical scrollbar in 29 * pixels 30 */ 31 private static final int SCROLL_BAR_SIZE = 10; 32 33 /** 34 * Defines the length of the fading edges in pixels 35 */ 36 private static final int FADING_EDGE_LENGTH = 12; 37 38 /** 39 * Defines the duration in milliseconds of the pressed state in child 40 * components. 41 */ 42 private static final int PRESSED_STATE_DURATION = 85; 43 44 /** 45 * Defines the duration in milliseconds before a press turns into 46 * a long press 47 */ 48 private static final int LONG_PRESS_TIMEOUT = 500; 49 50 /** 51 * Defines the duration in milliseconds a user needs to hold down the 52 * appropriate button to bring up the global actions dialog (power off, 53 * lock screen, etc). 54 */ 55 private static final int GLOBAL_ACTIONS_KEY_TIMEOUT = 500; 56 57 /** 58 * Defines the duration in milliseconds we will wait to see if a touch event 59 * is a tap or a scroll. If the user does not move within this interval, it is 60 * considered to be a tap. 61 */ 62 private static final int TAP_TIMEOUT = 100; 63 64 /** 65 * Defines the duration in milliseconds we will wait to see if a touch event 66 * is a jump tap. If the user does not complete the jump tap within this interval, it is 67 * considered to be a tap. 68 */ 69 private static final int JUMP_TAP_TIMEOUT = 500; 70 71 /** 72 * Defines the duration in milliseconds between the first tap's up event and 73 * the second tap's down event for an interaction to be considered a 74 * double-tap. 75 */ 76 private static final int DOUBLE_TAP_TIMEOUT = 300; 77 78 /** 79 * Defines the duration in milliseconds we want to display zoom controls in response 80 * to a user panning within an application. 81 */ 82 private static final int ZOOM_CONTROLS_TIMEOUT = 3000; 83 84 /** 85 * Inset in pixels to look for touchable content when the user touches the edge of the screen 86 */ 87 private static final int EDGE_SLOP = 12; 88 89 /** 90 * Distance a touch can wander before we think the user is scrolling in pixels 91 */ 92 private static final int TOUCH_SLOP = 25; 93 94 /** 95 * Distance between the first touch and second touch to still be considered a double tap 96 */ 97 private static final int DOUBLE_TAP_SLOP = 100; 98 99 /** 100 * Distance a touch needs to be outside of a window's bounds for it to 101 * count as outside for purposes of dismissing the window. 102 */ 103 private static final int WINDOW_TOUCH_SLOP = 16; 104 105 /** 106 * Minimum velocity to initiate a fling, as measured in pixels per second 107 */ 108 private static final int MINIMUM_FLING_VELOCITY = 50; 109 110 /** 111 * The maximum size of View's drawing cache, expressed in bytes. This size 112 * should be at least equal to the size of the screen in ARGB888 format. 113 */ 114 @Deprecated 115 private static final int MAXIMUM_DRAWING_CACHE_SIZE = 320 * 480 * 4; // HVGA screen, ARGB8888 116 117 /** 118 * The coefficient of friction applied to flings/scrolls. 119 */ 120 private static float SCROLL_FRICTION = 0.015f; 121 122 private final int mEdgeSlop; 123 private final int mFadingEdgeLength; 124 private final int mMinimumFlingVelocity; 125 private final int mScrollbarSize; 126 private final int mTouchSlop; 127 private final int mDoubleTapSlop; 128 private final int mWindowTouchSlop; 129 private final int mMaximumDrawingCacheSize; 130 131 private static final SparseArray<ViewConfiguration> sConfigurations = 132 new SparseArray<ViewConfiguration>(2); 133 134 /** 135 * @deprecated Use {@link android.view.ViewConfiguration#get(android.content.Context)} instead. 136 */ 137 @Deprecated 138 public ViewConfiguration() { 139 mEdgeSlop = EDGE_SLOP; 140 mFadingEdgeLength = FADING_EDGE_LENGTH; 141 mMinimumFlingVelocity = MINIMUM_FLING_VELOCITY; 142 mScrollbarSize = SCROLL_BAR_SIZE; 143 mTouchSlop = TOUCH_SLOP; 144 mDoubleTapSlop = DOUBLE_TAP_SLOP; 145 mWindowTouchSlop = WINDOW_TOUCH_SLOP; 146 //noinspection deprecation 147 mMaximumDrawingCacheSize = MAXIMUM_DRAWING_CACHE_SIZE; 148 } 149 150 /** 151 * Creates a new configuration for the specified context. The configuration depends on 152 * various parameters of the context, like the dimension of the display or the density 153 * of the display. 154 * 155 * @param context The application context used to initialize this view configuration. 156 * 157 * @see #get(android.content.Context) 158 * @see android.util.DisplayMetrics 159 */ 160 private ViewConfiguration(Context context) { 161 final DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 162 final float density = metrics.density; 163 164 mEdgeSlop = (int) (density * EDGE_SLOP + 0.5f); 165 mFadingEdgeLength = (int) (density * FADING_EDGE_LENGTH + 0.5f); 166 mMinimumFlingVelocity = (int) (density * MINIMUM_FLING_VELOCITY + 0.5f); 167 mScrollbarSize = (int) (density * SCROLL_BAR_SIZE + 0.5f); 168 mTouchSlop = (int) (density * TOUCH_SLOP + 0.5f); 169 mDoubleTapSlop = (int) (density * DOUBLE_TAP_SLOP + 0.5f); 170 mWindowTouchSlop = (int) (density * WINDOW_TOUCH_SLOP + 0.5f); 171 172 // Size of the screen in bytes, in ARGB_8888 format 173 mMaximumDrawingCacheSize = 4 * metrics.widthPixels * metrics.heightPixels; 174 } 175 176 /** 177 * Returns a configuration for the specified context. The configuration depends on 178 * various parameters of the context, like the dimension of the display or the 179 * density of the display. 180 * 181 * @param context The application context used to initialize the view configuration. 182 */ 183 public static ViewConfiguration get(Context context) { 184 final DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 185 final int density = (int) (100.0f * metrics.density); 186 187 ViewConfiguration configuration = sConfigurations.get(density); 188 if (configuration == null) { 189 configuration = new ViewConfiguration(context); 190 sConfigurations.put(density, configuration); 191 } 192 193 return configuration; 194 } 195 196 /** 197 * @return The width of the horizontal scrollbar and the height of the vertical 198 * scrollbar in pixels 199 * 200 * @deprecated Use {@link #getScaledScrollBarSize()} instead. 201 */ 202 @Deprecated 203 public static int getScrollBarSize() { 204 return SCROLL_BAR_SIZE; 205 } 206 207 /** 208 * @return The width of the horizontal scrollbar and the height of the vertical 209 * scrollbar in pixels 210 */ 211 public int getScaledScrollBarSize() { 212 return mScrollbarSize; 213 } 214 215 /** 216 * @return the length of the fading edges in pixels 217 * 218 * @deprecated Use {@link #getScaledFadingEdgeLength()} instead. 219 */ 220 @Deprecated 221 public static int getFadingEdgeLength() { 222 return FADING_EDGE_LENGTH; 223 } 224 225 /** 226 * @return the length of the fading edges in pixels 227 */ 228 public int getScaledFadingEdgeLength() { 229 return mFadingEdgeLength; 230 } 231 232 /** 233 * @return the duration in milliseconds of the pressed state in child 234 * components. 235 */ 236 public static int getPressedStateDuration() { 237 return PRESSED_STATE_DURATION; 238 } 239 240 /** 241 * @return the duration in milliseconds before a press turns into 242 * a long press 243 */ 244 public static int getLongPressTimeout() { 245 return LONG_PRESS_TIMEOUT; 246 } 247 248 /** 249 * @return the duration in milliseconds we will wait to see if a touch event 250 * is a tap or a scroll. If the user does not move within this interval, it is 251 * considered to be a tap. 252 */ 253 public static int getTapTimeout() { 254 return TAP_TIMEOUT; 255 } 256 257 /** 258 * @return the duration in milliseconds we will wait to see if a touch event 259 * is a jump tap. If the user does not move within this interval, it is 260 * considered to be a tap. 261 */ 262 public static int getJumpTapTimeout() { 263 return JUMP_TAP_TIMEOUT; 264 } 265 266 /** 267 * @return the duration in milliseconds between the first tap's up event and 268 * the second tap's down event for an interaction to be considered a 269 * double-tap. 270 * @hide pending API council 271 */ 272 public static int getDoubleTapTimeout() { 273 return DOUBLE_TAP_TIMEOUT; 274 } 275 276 /** 277 * @return Inset in pixels to look for touchable content when the user touches the edge of the 278 * screen 279 * 280 * @deprecated Use {@link #getScaledEdgeSlop()} instead. 281 */ 282 @Deprecated 283 public static int getEdgeSlop() { 284 return EDGE_SLOP; 285 } 286 287 /** 288 * @return Inset in pixels to look for touchable content when the user touches the edge of the 289 * screen 290 */ 291 public int getScaledEdgeSlop() { 292 return mEdgeSlop; 293 } 294 295 /** 296 * @return Distance a touch can wander before we think the user is scrolling in pixels 297 * 298 * @deprecated Use {@link #getScaledTouchSlop()} instead. 299 */ 300 @Deprecated 301 public static int getTouchSlop() { 302 return TOUCH_SLOP; 303 } 304 305 /** 306 * @return Distance a touch can wander before we think the user is scrolling in pixels 307 */ 308 public int getScaledTouchSlop() { 309 return mTouchSlop; 310 } 311 312 /** 313 * @return Distance between the first touch and second touch to still be 314 * considered a double tap 315 * @deprecated Use {@link #getScaledDoubleTapSlop()} instead. 316 * @hide The only client of this should be GestureDetector, which needs this 317 * for clients that still use its deprecated constructor. 318 */ 319 @Deprecated 320 public static int getDoubleTapSlop() { 321 return DOUBLE_TAP_SLOP; 322 } 323 324 /** 325 * @return Distance between the first touch and second touch to still be 326 * considered a double tap 327 * @hide pending API council 328 */ 329 public int getScaledDoubleTapSlop() { 330 return mDoubleTapSlop; 331 } 332 333 /** 334 * @return Distance a touch must be outside the bounds of a window for it 335 * to be counted as outside the window for purposes of dismissing that 336 * window. 337 * 338 * @deprecated Use {@link #getScaledWindowTouchSlop()} instead. 339 */ 340 @Deprecated 341 public static int getWindowTouchSlop() { 342 return WINDOW_TOUCH_SLOP; 343 } 344 345 /** 346 * @return Distance a touch must be outside the bounds of a window for it 347 * to be counted as outside the window for purposes of dismissing that 348 * window. 349 */ 350 public int getScaledWindowTouchSlop() { 351 return mWindowTouchSlop; 352 } 353 354 /** 355 * @return Minimum velocity to initiate a fling, as measured in pixels per second. 356 * 357 * @deprecated Use {@link #getScaledMinimumFlingVelocity()} instead. 358 */ 359 @Deprecated 360 public static int getMinimumFlingVelocity() { 361 return MINIMUM_FLING_VELOCITY; 362 } 363 364 /** 365 * @return Minimum velocity to initiate a fling, as measured in pixels per second. 366 */ 367 public int getScaledMinimumFlingVelocity() { 368 return mMinimumFlingVelocity; 369 } 370 371 /** 372 * The maximum drawing cache size expressed in bytes. 373 * 374 * @return the maximum size of View's drawing cache expressed in bytes 375 * 376 * @deprecated Use {@link #getScaledMaximumDrawingCacheSize()} instead. 377 */ 378 @Deprecated 379 public static int getMaximumDrawingCacheSize() { 380 //noinspection deprecation 381 return MAXIMUM_DRAWING_CACHE_SIZE; 382 } 383 384 /** 385 * The maximum drawing cache size expressed in bytes. 386 * 387 * @return the maximum size of View's drawing cache expressed in bytes 388 */ 389 public int getScaledMaximumDrawingCacheSize() { 390 return mMaximumDrawingCacheSize; 391 } 392 393 /** 394 * The amount of time that the zoom controls should be 395 * displayed on the screen expressed in milliseconds. 396 * 397 * @return the time the zoom controls should be visible expressed 398 * in milliseconds. 399 */ 400 public static long getZoomControlsTimeout() { 401 return ZOOM_CONTROLS_TIMEOUT; 402 } 403 404 /** 405 * The amount of time a user needs to press the relevant key to bring up 406 * the global actions dialog. 407 * 408 * @return how long a user needs to press the relevant key to bring up 409 * the global actions dialog. 410 */ 411 public static long getGlobalActionKeyTimeout() { 412 return GLOBAL_ACTIONS_KEY_TIMEOUT; 413 } 414 415 /** 416 * The amount of friction applied to scrolls and flings. 417 * 418 * @return A scalar dimensionless value representing the coefficient of 419 * friction. 420 */ 421 public static float getScrollFriction() { 422 return SCROLL_FRICTION; 423 } 424} 425