mButtonDrawable = d; setMinHeight(mButtonDrawable.getIntrinsicHeight()); } refreshDrawableState...(); } 最后调用了refreshDrawableState这个方法,这个执行过程我们也分析过,整个执行思路都是一样,不过不同的是,里面的很多方法都被覆盖了。...refreshDrawableState执行的还是View里面的这个方法,直接看源码。...public final int[] getDrawableState() { //PFLAG_DRAWABLE_STATE_DIRTY是前面refreshDrawableState设置的...函数,同样把上面的refreshDrawableState过程又执行了一遍,执行在到onCreateDrawableState就不一样了。
这里要使用refreshDrawableState()和onCreateDrawableState()这两个方法,如果你知道了,就当我在这里瞎比比吧!哈哈。。...= state) { pressed = state; refreshDrawableState(); } } @Override public int[] onCreateDrawableState...还有就是状态选择器,两个方法refreshDrawableState()和onCreateDrawableState()。
动画实现原理 原本以为在点击输入框的时候,会是在EditText的Focus改变的时候,开始执行动画,结果发现是在整个TextInputLayout的背景色Drawable发生改变的时候,才会开始执行动画 在refreshDrawableState...refreshDrawableState 而在updateLableVisibility函数中,会判断当前EditText中是否有文字或者获取到焦点,如果有的话,则开始执行expandHint(展开文本
= 0) { mPrivateFlags &= ~PRESSED; refreshDrawableState(); }...mPrivateFlags |= PRESSED; refreshDrawableState(); }...so show the feedback right away mPrivateFlags |= PRESSED; refreshDrawableState...pressed to not pressed mPrivateFlags &= ~PRESSED; refreshDrawableState...,只是不会再走下面的流程; 如果View是enable的且处于可点击状态,事件将被这个View消费: 在方法返回前,onTouchEvent会根据MotionEvent的不同类型做出不同响应,如调用refreshDrawableState
prepressed) { mPrivateFlags |= PRESSED; refreshDrawableState...case MotionEvent.ACTION_CANCEL: mPrivateFlags &= ~PRESSED; refreshDrawableState...to not pressed mPrivateFlags &= ~PRESSED; refreshDrawableState...run() { mPrivateFlags &= ~PREPRESSED; mPrivateFlags |= PRESSED; refreshDrawableState...mPrivateFlags |= PRESSED; } else { mPrivateFlags &= ~PRESSED; } refreshDrawableState
增加状态的过程如下: >定义状态数组 >重写protected int[] onCreateDrawableState(int extraSpace) >调用refreshDrawableState
= checked) { mChecked = checked; refreshDrawableState(); // Avoid infinite recursions
if (prepressed) { mPrivateFlags |= PRESSED; refreshDrawableState...case MotionEvent.ACTION_CANCEL: mPrivateFlags &= ~PRESSED; refreshDrawableState...from pressed to not pressed mPrivateFlags &= ~PRESSED; refreshDrawableState
this); } onFocusChanged(true, direction, previouslyFocusedRect);// 通知焦点变化回调 refreshDrawableState...mFocus 值,因为焦点已经不在该 View 树节点下 } onFocusChanged(false, 0, null);// 回调焦点状态变更的通知 refreshDrawableState...由于第 1 步中清除了自己的焦点状态,失焦之后自然需要刷新视图状态,这里会调用 refreshDrawableState 进行 drawableState 的刷新,也就是我们通常在 xml 中设置的 selector
(prepressed) { mPrivateFlags |= PRESSED; refreshDrawableState...case MotionEvent.ACTION_CANCEL: mPrivateFlags &= ~PRESSED; refreshDrawableState...removeLongPressCallback(); mPrivateFlags &= ~PRESSED; refreshDrawableState...{ mPrivateFlags &= ~PREPRESSED; mPrivateFlags |= PRESSED; refreshDrawableState
mParent.clearChildFocus(this); } onFocusChanged(false, 0, null); refreshDrawableState
= mChecked){ mChecked = b; refreshDrawableState(); } } @Override public boolean
. */ refreshDrawableState(); // Invalidate too, since the default behavior for views
事件类型=结束事件 case MotionEvent.ACTION_CANCEL: refreshDrawableState();...removeLongPressCallback(); mPrivateFlags &= ~PRESSED; refreshDrawableState
基本的逻辑在View.java中的onTouchEvent方法中实现的: case MotionEvent.ACTION_DOWN: mPrivateFlags |= PRESSED; refreshDrawableState
FLAG_UPDATE ) { ShowChildView(); } else { AddZuChildView(); } // linearLayout.refreshDrawableState
= null) refreshDrawableState(); setWillNotDraw(d == null); invalidate();
= null) refreshDrawableState(); setWillNotDraw(d == null); invalidate(); } /** * Set a drawable
领取专属 10元无门槛券
手把手带您无忧上云