一、ViewDragHelper
在另一篇博客里介绍了ViewDragHelper,这里就不再介绍了。
二、Activity左滑返回的简单实现
基本思路是使用ViewDragHelper自定义一个ViewGroup(命名为SwipeBackLayout),实现该ViewGroup的左滑效果。
项目效果图
一、 基本工作
为了省去自定义ViewGroup时onMeasure和onLayout的步骤,将SwipeBackLayout继承FrameLayout.
public class SwipeBackLayout extends FrameLayout定义一些成员变量:
private View mDragView; // 所拖动的子组件,即该布局下的子布局。 private ViewDragHelper mViewDragHelper; private int mCurrentX ; // 当前拖动的横坐标 private int mCurEdgeFlag = ViewDragHelper.EDGE_LEFT; // 记录当前边缘触发的方向在构造函数中完成初始化工作
private void init() { // 实例化ViewDragHelper对象,重点是其中的DragBackCallback的实现 mViewDragHelper = ViewDragHelper.create(this,1.0f,new DragBackCallback()); //对ViewDragHelper对象设置边缘触发 mViewDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); }将SwipeBackLayoout的触摸/滑动事件交给ViewDragHelper对象处理:
@Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)) { // 持续绘制 invalidate(); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev){ return mViewDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { mViewDragHelper.processTouchEvent(event); return true; }滑动结束监听接口的设置 :
private OnFinishScrollListener mFinishScrollListener; //设置滑动结束监听 public void setOnFinishScroll(OnFinishScrollListener finishScroll) { this.mFinishScrollListener = finishScroll; } //滑动结束接口 public interface OnFinishScrollListener { void complete(); }
二、DragBackCallback的实现
private class DragBackCallback extends ViewDragHelper.Callback{
@Override
public boolean tryCaptureView(View child, int pointerId) {
return false; // 先不捕捉滑动View
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
mCurrentX = (left < 0)? 0:left; //记录目前的滑动时的横坐标
return mCurrentX; //只允许mDragView左滑
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return 0;//防止上下滑动
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
// 判断当前的边缘触发是否为左边缘
if(mCurEdgeFlag == ViewDragHelper.EDGE_LEFT){
if (mCurrentX > getWidth()/2) {
// 当滑动横坐标超过布局的一般宽度时,将布局移出屏幕
mViewDragHelper.settleCapturedViewAt(getWidth(), 0);
}else {
// 否则回到初始正常状态,回到原点
mViewDragHelper.settleCapturedViewAt(0, 0);
mCurrentX = 0;
}
invalidate(); //重绘
}
}
@Override
public void onEdgeDragStarted(int edgeFlags, int pointerId) {
mCurEdgeFlag = edgeFlags; //获取边缘状态
// 捕捉拖动界面
mViewDragHelper.captureChildView(mDragView, pointerId);
}
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
//当拖动界面的位置发送变动时调用
if(mCurEdgeFlag==ViewDragHelper.EDGE_LEFT){
当拖动界面的left值大于布局的宽度(即布局退出屏幕时)时,则调用监听事情
if (left >= getWidth()) {
if (mFinishScrollListener != null) {
mFinishScrollListener.complete();
}
}
}
}
}
三、SwipeBackLayout的使用
- 布局文件xml示例:
注意SwipeBackLayout布局的孩子只能有一个
<?xml version="1.0" encoding="utf-8"?>
<com.cxmscb.cxm.dragbackproject.SwipeBackLayout
android:id="@+id/dragBackLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
>
<TextView
android:layout_width="match_parent"
android:layout_height="56dp"
android:textColor="#ffffff"
android:textSize="20sp"
android:gravity="center"
android:background="#ef8789"
android:text="show"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
</com.cxmscb.cxm.dragbackproject.SwipeBackLayout>
为了在布局滑动时能看到之前的Activity界面,对Activity的主题进行设置半透明且无Titlebar
android:theme="@android:style/Theme.Translucent.NoTitleBar"在activity中设计监听事件
swipeBackLayout.setOnFinishScroll(new SwipeBackLayout.OnFinishScrollListener() { @Override public void complete() { ShowActivity.this.finish(); Toast.makeText(ShowActivity.this,"finished",Toast.LENGTH_SHORT).show(); } })
本文介绍了如何使用ViewDragHelper在安卓开发中实现Activity的左滑返回功能。通过自定义SwipeBackLayout并实现DragBackCallback,详细阐述了基本工作、DragBackCallback的实现以及SwipeBackLayout的使用方法,包括布局文件配置和Activity主题设置。
1279

被折叠的 条评论
为什么被折叠?



