一個可以在界面頂部展現的自定義 View
這個源碼十分簡單,沒啥可說的.只有一點提一下,看到有些控件達到背景色的效果,是動態填加一個帶背景色父布局實現的.
我這里是在畫布上動態繪制的.
GitHub 地址: TranslationView
源碼如下:
public class TranslationView extends FrameLayout { private static final String TAG = "TranslationView"; private static final int DEFAULT_COLOR = 0x50000000; private int mShadowColor = DEFAULT_COLOR; private boolean mIsShow = false; private View mTranslationView; public TranslationView(Context context) { super(context, null); } public TranslationView(Context context, AttributeSet attrs) { super(context, attrs, 0); } public TranslationView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onFinishInflate() { if (getChildCount() != 2) { throw new IllegalStateException("only and should contain two child view"); } mTranslationView = getChildAt(1); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.d(TAG, "onMeasure"); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); mTranslationView.layout(0, -mTranslationView.getHeight(), mTranslationView.getWidth(), 0); } @Override protected boolean drawChild(Canvas canvas, View child, long drawingTime) { if (mIsShow && child == mTranslationView) { canvas.drawColor(mShadowColor); } return super.drawChild(canvas, child, drawingTime); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = MotionEventCompat.getActionMasked(ev); switch (action){ case MotionEvent.ACTION_DOWN:{ if(mIsShow&&inShadow(ev)){ hide(); return true; } } } return super.onInterceptTouchEvent(ev); } private boolean inShadow(MotionEvent ev) { float x = ev.getX(); float y = ev.getY(); final float leftEdge = mTranslationView.getX(); final float rightEdge = leftEdge+mTranslationView.getWidth(); final float topEdge =mTranslationView.getHeight(); final float bottomEdge = getHeight()+topEdge; return x > leftEdge && x < rightEdge && y > topEdge && y < bottomEdge; } public void show() { if (!mIsShow) { mIsShow = true; ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTranslationView, "translationY", mTranslationView.getTranslationY(), mTranslationView.getHeight()); objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); invalidate(); } }); objectAnimator.start(); } } public void hide() { if (mIsShow) { mIsShow = false; ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTranslationView, "translationY", mTranslationView.getTranslationY(), -mTranslationView.getHeight()); objectAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); invalidate(); } }); objectAnimator.start(); } } public void setShadowColor(@ColorInt int color) { mShadowColor = color; } }
效果圖如下:
TranslationView.gif
來自:http://www.jianshu.com/p/aa4d3b4b4a04
本文由用戶 tusp0079 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!