类代码:
package android.support.v4.view;
import android.content.res.ColorStateList;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.FloatRange;
import android.support.annotation.IdRes;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.accessibility.AccessibilityEvent;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.WeakHashMap;
/**API4以后引入的实现兼容的一个帮助类
* Helper for accessing features in {@link View} introduced after API
* level 4 in a backwards compatible fashion.
*/
public class ViewCompat {
private static final String TAG = "ViewCompat";
//常量 略,本节旨在观察此类的结构
//这个接口列出了这个类支持的方法,这些方法在此类中都有实现,我们也可以实现此接口进行重写
interface ViewCompatImpl {
public boolean canScrollHorizontally(View v, int direction);
public boolean canScrollVertically(View v, int direction);
public int getOverScrollMode(View v);
public void setOverScrollMode(View v, int mode);
public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
public void setAccessibilityDelegate(View v, @Nullable AccessibilityDelegateCompat delegate);
public boolean hasAccessibilityDelegate(View v);
public boolean hasTransientState(View view);
public void setHasTransientState(View view, boolean hasTransientState);
public void postInvalidateOnAnimation(View view);
public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom);
public void postOnAnimation(View view, Runnable action);
public void postOnAnimationDelayed(View view, Runnable action, long delayMillis);
public int getImportantForAccessibility(View view);
public void setImportantForAccessibility(View view, int mode);
public boolean isImportantForAccessibility(View view);
public boolean performAccessibilityAction(View view, int action, Bundle arguments);
public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view);
public float getAlpha(View view);
public void setLayerType(View view, int layerType, Paint paint);
public int getLayerType(View view);
public int getLabelFor(View view);
public void setLabelFor(View view, int id);
public void setLayerPaint(View view, Paint paint);
public int getLayoutDirection(View view);
public void setLayoutDirection(View view, int layoutDirection);
public ViewParent getParentForAccessibility(View view);
public boolean isOpaque(View view);
public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState);
public int getMeasuredWidthAndState(View view);
public int getMeasuredHeightAndState(View view);
public int getMeasuredState(View view);
public int getAccessibilityLiveRegion(View view);
public void setAccessibilityLiveRegion(View view, int mode);
public int getPaddingStart(View view);
public int getPaddingEnd(View view);
public void setPaddingRelative(View view, int start, int top, int end, int bottom);
public void dispatchStartTemporaryDetach(View view);
public void dispatchFinishTemporaryDetach(View view);
public float getX(View view);
public float getY(View view);
public float getRotation(View view);
public float getRotationX(View view);
public float getRotationY(View view);
public float getScaleX(View view);
public float getScaleY(View view);
public float getTranslationX(View view);
public float getTranslationY(View view);
public int getMinimumWidth(View view);
public int getMinimumHeight(View view);
public ViewPropertyAnimatorCompat animate(View view);
public void setRotation(View view, float value);
public void setRotationX(View view, float value);
public void setRotationY(View view, float value);
public void setScaleX(View view, float value);
public void setScaleY(View view, float value);
public void setTranslationX(View view, float value);
public void setTranslationY(View view, float value);
public void setX(View view, float value);
public void setY(View view, float value);
public void setAlpha(View view, float value);
public void setPivotX(View view, float value);
public void setPivotY(View view, float value);
public float getPivotX(View view);
public float getPivotY(View view);
public void setElevation(View view, float elevation);
public float getElevation(View view);
public void setTranslationZ(View view, float translationZ);
public float getTranslationZ(View view);
public void setClipBounds(View view, Rect clipBounds);
public Rect getClipBounds(View view);
public void setTransitionName(View view, String transitionName);
public String getTransitionName(View view);
public int getWindowSystemUiVisibility(View view);
public void requestApplyInsets(View view);
public void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled);
public boolean getFitsSystemWindows(View view);
public boolean hasOverlappingRendering(View view);
void setFitsSystemWindows(View view, boolean fitSystemWindows);
void jumpDrawablesToCurrentState(View v);
void setOnApplyWindowInsetsListener(View view, OnApplyWindowInsetsListener listener);
WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);
WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets);
void setSaveFromParentEnabled(View view, boolean enabled);
void setActivated(View view, boolean activated);
boolean isPaddingRelative(View view);
ColorStateList getBackgroundTintList(View view);
void setBackgroundTintList(View view, ColorStateList tintList);
PorterDuff.Mode getBackgroundTintMode(View view);
void setBackgroundTintMode(View view, PorterDuff.Mode mode);
void setNestedScrollingEnabled(View view, boolean enabled);
boolean isNestedScrollingEnabled(View view);
boolean startNestedScroll(View view, int axes);
void stopNestedScroll(View view);
boolean hasNestedScrollingParent(View view);
boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed, int dxUnconsumed,
int dyUnconsumed, int[] offsetInWindow);
boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
int[] offsetInWindow);
boolean dispatchNestedFling(View view, float velocityX, float velocityY, boolean consumed);
boolean dispatchNestedPreFling(View view, float velocityX, float velocityY);
boolean isLaidOut(View view);
int combineMeasuredStates(int curState, int newState);
public float getZ(View view);
public boolean isAttachedToWindow(View view);
public boolean hasOnClickListeners(View view);
public void setScrollIndicators(View view, int indicators);
public void setScrollIndicators(View view, int indicators, int mask);
public int getScrollIndicators(View view);
}
static class BaseViewCompatImpl implements ViewCompatImpl {
private Method mDispatchStartTemporaryDetach;
private Method mDispatchFinishTemporaryDetach;
private boolean mTempDetachBound;
WeakHashMap<View, ViewPropertyAnimatorCompat> mViewPropertyAnimatorCompatMap = null;
public boolean canScrollHorizontally(View v, int direction) {
return (v instanceof ScrollingView) &&
canScrollingViewScrollHorizontally((ScrollingView) v, direction);
}
public boolean canScrollVertically(View v, int direction) {
return (v instanceof ScrollingView) &&
canScrollingViewScrollVertically((ScrollingView) v, direction);
}
public int getOverScrollMode(View v) {
return OVER_SCROLL_NEVER;
}
public void setOverScrollMode(View v, int mode) {
// Do nothing; API doesn't exist
}
public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
// Do nothing; API doesn't exist
}
@Override
public boolean hasAccessibilityDelegate(View v) {
return false;
}