Android应用开发之在界面顶部滑动展开的自定义FrameLayout
白羽 2018-08-10 来源 :网络 阅读 1047 评论 0

摘要:本文将带你了解Android应用开发之在界面顶部滑动展开的自定义FrameLayout,希望本文对大家学Android有所帮助

        本文将带你了解Android应用开发之在界面顶部滑动展开的自定义FrameLayout,希望本文对大家学Android有所帮助


用法:
Java代码  translationView.show();  translationView.hide();  translationView.setShadowColor(ActivityCompat.getColor(MainActivity.this, R.color.blue));//设置背景颜色  translationView.show();
translationView.hide();
translationView.setShadowColor(ActivityCompat.getColor(MainActivity.this, R.color.blue));//设置背景颜色


源码:
Java代码  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;      }  }  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;
    }
}    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程