下面列出了android.view.View#setWillNotDraw ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Supply a Drawable that is to be rendered on top of all of the child
* views in the frame layout. Any padding in the Drawable will be taken
* into account by ensuring that the children are inset to be placed
* inside of the padding area.
*
* @param drawable The Drawable to be drawn on top of the children.
*/
public void setForeground(View view, Drawable drawable) {
if (view != null) {
if (mForeground != drawable) {
if (mForeground != null) {
mForeground.setCallback(null);
view.unscheduleDrawable(mForeground);
}
mForeground = drawable;
if (drawable != null) {
view.setWillNotDraw(false);
drawable.setCallback(view);
if (drawable.isStateful()) {
drawable.setState(view.getDrawableState());
}
if (mForegroundGravity == Gravity.FILL) {
Rect padding = new Rect();
drawable.getPadding(padding);
}
//update bounds
updateBounds(view, drawable);//added by song
} else {
view.setWillNotDraw(true);
}
view.requestLayout();
view.invalidate();
}
}
}
private static void prepareViewHierarchyForScreenshot(View view, boolean takingScreenshot) {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
prepareViewHierarchyForScreenshot(viewGroup.getChildAt(i), takingScreenshot);
}
} else if (view instanceof SurfaceView) {
view.setWillNotDraw(!takingScreenshot);
}
}
private static void prepareViewHierarchyForScreenshot(View view, boolean takingScreenshot) {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
prepareViewHierarchyForScreenshot(viewGroup.getChildAt(i), takingScreenshot);
}
} else if (view instanceof SurfaceView) {
view.setWillNotDraw(!takingScreenshot);
}
}
private static void prepareViewHierarchyForScreenshot(View view, boolean takingScreenshot) {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
prepareViewHierarchyForScreenshot(viewGroup.getChildAt(i), takingScreenshot);
}
} else if (view instanceof SurfaceView) {
view.setWillNotDraw(!takingScreenshot);
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LayoutParams layoutParams =
new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int coordinatorLayoutOffset = getResources().getDimensionPixelSize(R.dimen.coordinator_layout_offset);
if (fabGravity == BOTTOM_END || fabGravity == TOP_END) {
layoutParams.setMargins(0, 0, coordinatorLayoutOffset, 0);
} else {
layoutParams.setMargins(coordinatorLayoutOffset, 0, 0, 0);
}
menuItemsLayout.setLayoutParams(layoutParams);
// Needed in order to intercept key events
setFocusableInTouchMode(true);
if (useTouchGuard) {
ViewParent parent = getParent();
touchGuard = new View(getContext());
touchGuard.setOnClickListener(this);
touchGuard.setWillNotDraw(true);
touchGuard.setVisibility(GONE);
if (touchGuardDrawable != null) {
touchGuard.setBackground(touchGuardDrawable);
}
if (parent instanceof FrameLayout) {
FrameLayout frameLayout = (FrameLayout) parent;
frameLayout.addView(touchGuard, frameLayout.indexOfChild(this));
} else if (parent instanceof CoordinatorLayout) {
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) parent;
coordinatorLayout.addView(touchGuard, coordinatorLayout.indexOfChild(this));
} else if (parent instanceof RelativeLayout) {
((RelativeLayout) parent).addView(
touchGuard, ((RelativeLayout) parent).indexOfChild(this),
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
} else {
Log.d(TAG, "touchGuard requires that the parent of this FabSpeedDialer be a FrameLayout or RelativeLayout");
}
}
setOnClickListener(this);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LayoutParams layoutParams =
new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int coordinatorLayoutOffset = getResources().getDimensionPixelSize(R.dimen.coordinator_layout_offset);
if (fabGravity == BOTTOM_END || fabGravity == TOP_END) {
layoutParams.setMargins(0, 0, coordinatorLayoutOffset, 0);
} else {
layoutParams.setMargins(coordinatorLayoutOffset, 0, 0, 0);
}
menuItemsLayout.setLayoutParams(layoutParams);
// Needed in order to intercept key events
setFocusableInTouchMode(true);
if (useTouchGuard) {
ViewParent parent = getParent();
touchGuard = new View(getContext());
touchGuard.setOnClickListener(this);
touchGuard.setWillNotDraw(true);
touchGuard.setVisibility(GONE);
if (touchGuardDrawable != null) {
touchGuard.setBackground(touchGuardDrawable);
}
if (parent instanceof FrameLayout) {
FrameLayout frameLayout = (FrameLayout) parent;
frameLayout.addView(touchGuard, frameLayout.indexOfChild(this));
} else if (parent instanceof CoordinatorLayout) {
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) parent;
coordinatorLayout.addView(touchGuard, coordinatorLayout.indexOfChild(this));
} else if (parent instanceof RelativeLayout) {
((RelativeLayout) parent).addView(
touchGuard, ((RelativeLayout) parent).indexOfChild(this),
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
} else {
Log.d(TAG, "touchGuard requires that the parent of this FabSpeedDialer be a FrameLayout or RelativeLayout");
}
}
setOnClickListener(this);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LayoutParams layoutParams =
new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int coordinatorLayoutOffset = getResources().getDimensionPixelSize(R.dimen.coordinator_layout_offset);
if (fabGravity == BOTTOM_END || fabGravity == TOP_END) {
layoutParams.setMargins(0, 0, coordinatorLayoutOffset, 0);
} else {
layoutParams.setMargins(coordinatorLayoutOffset, 0, 0, 0);
}
menuItemsLayout.setLayoutParams(layoutParams);
// Needed in order to intercept key events
setFocusableInTouchMode(true);
if (useTouchGuard) {
ViewParent parent = getParent();
touchGuard = new View(getContext());
touchGuard.setOnClickListener(this);
touchGuard.setWillNotDraw(true);
touchGuard.setVisibility(GONE);
if (touchGuardDrawable != null) {
touchGuard.setBackground(touchGuardDrawable);
}
if (parent instanceof FrameLayout) {
FrameLayout frameLayout = (FrameLayout) parent;
frameLayout.addView(touchGuard, frameLayout.indexOfChild(this));
} else if (parent instanceof CoordinatorLayout) {
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) parent;
coordinatorLayout.addView(touchGuard, coordinatorLayout.indexOfChild(this));
} else if (parent instanceof RelativeLayout) {
((RelativeLayout) parent).addView(
touchGuard, ((RelativeLayout) parent).indexOfChild(this),
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
} else {
Log.d(TAG, "touchGuard requires that the parent of this FabSpeedDialer be a FrameLayout or RelativeLayout");
}
}
setOnClickListener(this);
}
@Override
public Animator createAnimator(
ViewGroup sceneRoot,
TransitionValues startValues,
TransitionValues endValues) {
if (startValues == null || endValues == null) return null;
final View view = endValues.view;
AnimatorSet transition = new AnimatorSet();
ReflowData startData = (ReflowData) startValues.values.get(PROPNAME_DATA);
ReflowData endData = (ReflowData) endValues.values.get(PROPNAME_DATA);
duration = calculateDuration(startData.bounds, endData.bounds);
// create layouts & capture a bitmaps of the text in both states
// (with max lines variants where needed)
Layout startLayout = createLayout(startData, sceneRoot.getContext(), false);
Layout endLayout = createLayout(endData, sceneRoot.getContext(), false);
Layout startLayoutMaxLines = null;
Layout endLayoutMaxLines = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // StaticLayout maxLines support
if (startData.maxLines != -1) {
startLayoutMaxLines = createLayout(startData, sceneRoot.getContext(), true);
}
if (endData.maxLines != -1) {
endLayoutMaxLines = createLayout(endData, sceneRoot.getContext(), true);
}
}
final Bitmap startText = createBitmap(startData,
startLayoutMaxLines != null ? startLayoutMaxLines : startLayout);
final Bitmap endText = createBitmap(endData,
endLayoutMaxLines != null ? endLayoutMaxLines : endLayout);
// temporarily turn off clipping so we can draw outside of our bounds don't draw
view.setWillNotDraw(true);
((ViewGroup) view.getParent()).setClipChildren(false);
// calculate the runs of text to move together
List<Run> runs = getRuns(startData, startLayout, startLayoutMaxLines,
endData, endLayout, endLayoutMaxLines);
// create animators for moving, scaling and fading each run of text
transition.playTogether(
createRunAnimators(view, startData, endData, startText, endText, runs));
if (!freezeFrame) {
transition.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
// clean up
view.setWillNotDraw(false);
view.getOverlay().clear();
((ViewGroup) view.getParent()).setClipChildren(true);
startText.recycle();
endText.recycle();
}
});
}
return transition;
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LayoutParams layoutParams =
new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int coordinatorLayoutOffset = getResources().getDimensionPixelSize(R.dimen.coordinator_layout_offset);
if (fabGravity == BOTTOM_END || fabGravity == TOP_END) {
layoutParams.setMargins(0, 0, coordinatorLayoutOffset, 0);
} else {
layoutParams.setMargins(coordinatorLayoutOffset, 0, 0, 0);
}
menuItemsLayout.setLayoutParams(layoutParams);
// Set up the client's FAB
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setImageDrawable(fabDrawable);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fab.setImageTintList(fabDrawableTint);
}
if (fabBackgroundTint != null) {
fab.setBackgroundTintList(fabBackgroundTint);
}
fab.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (isAnimating) return;
if (isMenuOpen()) {
closeMenu();
} else {
openMenu();
}
}
});
// Needed in order to intercept key events
setFocusableInTouchMode(true);
if (useTouchGuard) {
ViewParent parent = getParent();
touchGuard = new View(getContext());
touchGuard.setOnClickListener(this);
touchGuard.setWillNotDraw(true);
touchGuard.setVisibility(GONE);
if (touchGuardDrawable != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
touchGuard.setBackground(touchGuardDrawable);
} else {
touchGuard.setBackgroundDrawable(touchGuardDrawable);
}
}
if (parent instanceof FrameLayout) {
FrameLayout frameLayout = (FrameLayout) parent;
frameLayout.addView(touchGuard);
bringToFront();
} else if (parent instanceof CoordinatorLayout) {
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) parent;
coordinatorLayout.addView(touchGuard);
bringToFront();
} else if (parent instanceof RelativeLayout) {
RelativeLayout relativeLayout = (RelativeLayout) parent;
relativeLayout.addView(touchGuard,
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
bringToFront();
} else {
Log.d(TAG, "touchGuard requires that the parent of this FabSpeedDialer be a FrameLayout or RelativeLayout");
}
}
setOnClickListener(this);
if (shouldOpenMenu)
openMenu();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LayoutParams layoutParams =
new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
int coordinatorLayoutOffset = getResources().getDimensionPixelSize(R.dimen.coordinator_layout_offset);
if (fabGravity == BOTTOM_END || fabGravity == TOP_END) {
layoutParams.setMargins(0, 0, coordinatorLayoutOffset, 0);
} else {
layoutParams.setMargins(coordinatorLayoutOffset, 0, 0, 0);
}
menuItemsLayout.setLayoutParams(layoutParams);
// Set up the client's FAB
fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setImageDrawable(fabDrawable);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
fab.setImageTintList(fabDrawableTint);
}
if (fabBackgroundTint != null) {
fab.setBackgroundTintList(fabBackgroundTint);
}
fab.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (isAnimating) return;
if (isMenuOpen()) {
closeMenu();
} else {
openMenu();
}
}
});
// Needed in order to intercept key events
setFocusableInTouchMode(true);
if (useTouchGuard) {
ViewParent parent = getParent();
touchGuard = new View(getContext());
touchGuard.setOnClickListener(this);
touchGuard.setWillNotDraw(true);
touchGuard.setVisibility(GONE);
if (touchGuardDrawable != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
touchGuard.setBackground(touchGuardDrawable);
} else {
touchGuard.setBackgroundDrawable(touchGuardDrawable);
}
}
if (parent instanceof FrameLayout) {
FrameLayout frameLayout = (FrameLayout) parent;
frameLayout.addView(touchGuard);
bringToFront();
} else if (parent instanceof CoordinatorLayout) {
CoordinatorLayout coordinatorLayout = (CoordinatorLayout) parent;
coordinatorLayout.addView(touchGuard);
bringToFront();
} else if (parent instanceof RelativeLayout) {
RelativeLayout relativeLayout = (RelativeLayout) parent;
relativeLayout.addView(touchGuard,
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
bringToFront();
} else {
Log.d(TAG, "touchGuard requires that the parent of this FabSpeedDialer be a FrameLayout or RelativeLayout");
}
}
setOnClickListener(this);
if (shouldOpenMenu)
openMenu();
}