当前位置: 首页 > 编程笔记 >

Android 侧边滑动关闭Activity的示例代码

红朝
2023-03-14
本文向大家介绍Android 侧边滑动关闭Activity的示例代码,包括了Android 侧边滑动关闭Activity的示例代码的使用技巧和注意事项,需要的朋友参考一下

0.效果图

1.设置Activity样式属性

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowIsTranslucent">true</item>
</style>

2.自定义侧边阴影视图

class SlideBackView extends View {

    private Paint mBgPaint, mShadowPaint;
    private RectF mBgRectF, mShadowRectF;
    private float mRatio;
    private float mShadowSize;

    public SlideBackView(Context context) {
      super(context);
      mBgPaint = new Paint();
      mBgPaint.setAntiAlias(true);
      mBgPaint.setColor(0xff000000);
      mShadowPaint = new Paint();
      mShadowPaint.setAntiAlias(true);
      mShadowPaint.setStyle(Paint.Style.FILL);
      mShadowSize = dp2px(15);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      mBgRectF = new RectF();
      mBgRectF.top = 0;
      mBgRectF.left = 0;
      mBgRectF.bottom = MeasureSpec.getSize(heightMeasureSpec);

      mShadowRectF = new RectF();
      mShadowRectF.top = 0;
      mShadowRectF.bottom = MeasureSpec.getSize(heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      int width = getMeasuredWidth();
      float right = mRatio * width;
      mBgRectF.right = right;
      mBgPaint.setAlpha((int) (128 * (1 - mRatio)));
      canvas.drawRect(mBgRectF, mBgPaint);
      mShadowRectF.left = right - mShadowSize;
      mShadowRectF.right = right;
      mShadowPaint.setShader(new LinearGradient(mShadowRectF.left, 0, mShadowRectF.right, 0, 0x00000000, 0x26000000, Shader.TileMode.CLAMP));
      canvas.drawRect(mShadowRectF, mShadowPaint);
    }

    public void setDistance(float ratio) {
      mRatio = ratio;
      invalidate();
    }

    private float dp2px(float dpValue) {
      float density = getResources().getDisplayMetrics().density;
      return dpValue * density + 0.5F;
    }
  }

3.定义可滑动的Activity父类

public class SlideBaseActivity extends AppCompatActivity implements ValueAnimator.AnimatorUpdateListener {

  private boolean isAnimate, isSlide, isHandle;
  private float moveNum;
  private float lastX, lastY;
  private int lastPointerCount;
  private float mAnimatedValue;
  private ValueAnimator mValueAnimator;
  private SlideBackView mSlideBackView;
  private float mTouchSlop;
  private List<ShieldView> shieldViews = new ArrayList<>();

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    super.onCreate(savedInstanceState);
    initAnimator();
    initSlideBackView();
    mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
  }

  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
    mAnimatedValue = (float) animation.getAnimatedValue();
    moveView(mAnimatedValue);
  }

  @Override
  public boolean dispatchTouchEvent(MotionEvent event) {
    if (!isAnimate) {
      float x = event.getRawX();
      float y = event.getRawY();
      if (event.getPointerCount() != lastPointerCount) {
        lastPointerCount = event.getPointerCount();
        lastX = x;
        lastY = y;
      }
      float offsetX, offsetY;
      switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
          offsetX = x - lastX;
          offsetY = y - lastY;
          if (!isHandle) {
            float absX = Math.abs(offsetX);
            float absY = Math.abs(offsetY);
            if (absX > mTouchSlop) {
              if (absX * 0.5f > absY) {
                isSlide = true;
                checkSlide((int) x, (int) y);
              } else {
                isSlide = false;
              }
              isHandle = true;
            }
          } else if (isSlide) {
            moveNum += offsetX;
            if (moveNum < 0) {
              moveNum = 0;
            }
            moveView(moveNum);
            lastX = event.getX();
          }
          break;
        case MotionEvent.ACTION_UP:
          if (isHandle) {
            isSlide = false;
            isHandle = false;
            isAnimate = true;
            int width = getWindow().getDecorView().getMeasuredWidth();
            if (moveNum < width / 3f) {
              mValueAnimator.setFloatValues(moveNum, 0);
            } else {
              mValueAnimator.setFloatValues(moveNum, width);
            }
            mValueAnimator.start();
            moveNum = 0;
            lastPointerCount = 0;
          }
      }
    }
    return isSlide || super.dispatchTouchEvent(event);
  }

  /**
   * 添加禁用滑动的子布局
   */
  public void addShieldView(View view) {
    shieldViews.add(new ShieldView(false, view));
  }

  /**
   * 添加水平禁用滑动的子布局
   */
  public void addHorizontalShieldView(View view) {
    shieldViews.add(new ShieldView(true, view));
  }

  /**
   * 移除禁用滑动的子布局
   */
  public void removeShieldView(View view) {
    for (ShieldView v : shieldViews) {
      if (v.view != null && v.view.equals(view)) {
        shieldViews.remove(v);
        break;
      }
    }
  }

  /**
   * 清空禁用滑动的子布局
   */
  public void clearShieldView() {
    shieldViews.clear();
  }

  private void initAnimator() {
    mValueAnimator = new ValueAnimator();
    mValueAnimator.setDuration(300);
    mValueAnimator.addUpdateListener(this);
    mValueAnimator.addListener(new AnimatorListenerAdapter() {
      @Override
      public void onAnimationEnd(Animator animation) {
        isAnimate = false;
        if (mAnimatedValue == getWindow().getDecorView().getMeasuredWidth()) {
          SlideBaseActivity.super.finish();
          overridePendingTransition(0, 0);
        }
      }
    });
  }

  private void initSlideBackView() {
    mSlideBackView = new SlideBackView(this);
    ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    decorView.addView(mSlideBackView);
  }

  private void moveView(float moveX) {
    ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
    mSlideBackView.setDistance(moveX / decorView.getMeasuredWidth());
    int count = decorView.getChildCount();
    for (int i = 0; i < count; i++) {
      View view = decorView.getChildAt(i);
      if (view != mSlideBackView) {
        view.setX(moveX);
      }
    }
  }

  private void checkSlide(int x, int y) {
    for (ShieldView v : shieldViews) {
      Rect rect = new Rect();
      v.view.getGlobalVisibleRect(rect);
      if (rect.contains(x, y) && (!(lastX < x && !v.view.canScrollHorizontally(-1)) || (!v.isHorizontal))) {
        isSlide = false;
      }
    }
  }
  
  class ShieldView {
    boolean isHorizontal;
    View view;

    public ShieldView(boolean isHorizontal, View view) {
      this.isHorizontal = isHorizontal;
      this.view = view;
    }
  }
}

4.使用

继承SlideBaseActivity类,可调用addShieldView或addHorizontalShieldView方法解决事件冲突。

5.项目源码

https://gitee.com/yugu/slide-demo

总结

到此这篇关于Android 侧边滑动关闭Activity的文章就介绍到这了,更多相关Android 侧边滑动关闭Activity内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍Android仿微信activity滑动关闭效果,包括了Android仿微信activity滑动关闭效果的使用技巧和注意事项,需要的朋友参考一下 Android仿微信activity滑动关闭功能 1.利用具体利用v4包下的slidingPaneLayout实现透明的activity,代码如下: activity 透明style: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希

  • 本文向大家介绍Android studio有关侧滑的实现代码,包括了Android studio有关侧滑的实现代码的使用技巧和注意事项,需要的朋友参考一下 最近写课设,因为是新手,实现起来比较麻烦。所以写下此笔记,免得我以后忘记了。 附图片: //主页面的布局 activity_main.xml: 头部的布局(放入layout) stumenu1.xml: 菜单的布局:(放在menu文件夹) st

  • 本文向大家介绍Android侧边栏滑动切换的view效果,包括了Android侧边栏滑动切换的view效果的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,具体代码如下所示: 以上所述是小编给大家介绍的Android侧边栏滑动切换的view效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 本文向大家介绍Android实现仿通讯录侧边栏滑动SiderBar效果代码,包括了Android实现仿通讯录侧边栏滑动SiderBar效果代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现仿通讯录侧边栏滑动SiderBar效果代码。分享给大家供大家参考,具体如下: 之前看到某些应用的侧边栏做得不错,想想自己也弄一个出来,现在分享出来,当然里面还有不足的地方,请大家多多包

  • 本文向大家介绍Android 中 viewpager 滑动指示器的实例代码,包括了Android 中 viewpager 滑动指示器的实例代码的使用技巧和注意事项,需要的朋友参考一下 先看下效果图: 这个需要用到1个开源的 库,这个后面也会说下的。 工程目录: 1. MainActivity.java UnderlinePageIndicatorEx.java ArrayFragment.java

  • 本文向大家介绍Android高仿QQ6.0侧滑删除实例代码,包括了Android高仿QQ6.0侧滑删除实例代码的使用技巧和注意事项,需要的朋友参考一下 推荐阅读: 先给大家分享一下,侧滑删除,布局也就是前面一个item,然后有两个隐藏的按钮(TextView也可以),然后我们可以向左侧滑动,然后显示出来,然后对delete(删除键)实现监听,就可以了哈。好了那就来看看代码怎么实现的吧。 首先和之前