在界面顶部滑动展开的自定义FrameLayout
2017-04-10 19:13
288 查看
用法:
translationView.show(); translationView.hide(); translationView.setShadowColor(ActivityCompat.getColor(MainActivity.this, R.color.blue));//设置背景颜色
源码:
import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Canvas; import android.support.annotation.ColorInt; import android.support.v4.view.MotionEventCompat; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; 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; } }
大小: 178.8 KB
查看图片附件
相关文章推荐
- Android界面,固定顶部、底部导航。中间可滑动
- Android ViewPager和Fragment实现顶部导航界面滑动效果
- 【Android界面实现】自定义滑动开关控件的实现与使用
- Android ViewPager和Fragment实现顶部导航界面滑动效果
- 安卓选择器类库,包括日期选择器、时间选择器、单项选择器、数字选择器、二三级联动选择器、省市区地址选择器、颜色选择器、文件目录选择器等,可自定义顶部及底部界面,可自定义窗口动画
- 仿网易滑动界面+仿安卓顶部滑动按钮
- 可自定义滑动速度的下滑展开菜单
- TabActivity导航栏自定义并显示在界面顶部
- 【Android】viewpager+fragment实现界面滑动,顶部导航也滑动
- 原来操控界面可以这么简单----安卓上下滑动缩放顶部图片,左右滑动结束当前Activity,及View柔和回弹效果
- 一个可以在界面顶部展现的自定义 View
- ViewPager和Fragment结合使用,可以做出顶部导航界面滑动效果
- IOS 自定义滑动Tab(顶部) 带滑动的条条
- Android ViewPager和Fragment实现顶部导航界面滑动效果
- 自定义仿ViewParger无限循环滑动界面
- 一个案例教你简单地玩转ViewPager(二)之ViewPaper+TabLayout+Fragment顶部标签界面滑动
- Android自定义ScrollView:实现滑动顶部停靠
- Android之新闻客服端顶部导航栏Tab点击和左右滑动实现切换界面
- Android自定义控件之实现listview滑动时渐隐渐现顶部栏
- 教你如何使用ViewPager+Fragment一步步打造顶部导航界面滑动效果