Android Realizes Left Slide Exit Perfect Package of Activity
- 2021-12-11 08:50:49
- OfStack
1: Define a parent container of its own and let it inherit from a layout (LinearLayout, RelativeLayout can be used)
public class SildingFinishLayout extends RelativeLayout implements View.OnTouchListener {
/**
* SildingFinishLayout Parent layout of layout
*/
private ViewGroup mParentView;
/**
* Handling sliding logic View
*/
private View touchView;
/**
* Minimum distance of sliding
*/
private int mTouchSlop;
/**
* Press the dot X Coordinates
*/
private int downX;
/**
* Press the dot Y Coordinates
*/
private int downY;
/**
* Temporary storage X Coordinates
*/
private int tempX;
/**
* Sliding class
*/
private Scroller mScroller;
/**
* SildingFinishLayout Width of
*/
private int viewWidth;
/**
* Is the record sliding
*/
private boolean isSilding;
private OnSildingFinishListener onSildingFinishListener;
private boolean isFinish;
public SildingFinishLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mScroller = new Scroller(context);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (changed) {
// Get SildingFinishLayout Parent layout of the layout
mParentView = (ViewGroup) this.getParent();
viewWidth = this.getWidth();
}
}
/**
* Settings OnSildingFinishListener, In onSildingFinish() Method finish Activity
*
* @param onSildingFinishListener
*/
public void setOnSildingFinishListener(
OnSildingFinishListener onSildingFinishListener) {
this.onSildingFinishListener = onSildingFinishListener;
}
/**
* Settings Touch Adj. View
*
* @param touchView
*/
public void setTouchView(View touchView) {
this.touchView = touchView;
touchView.setOnTouchListener(this);
}
public View getTouchView() {
return touchView;
}
/**
* Scroll out interface
*/
private void scrollRight() {
final int delta = (viewWidth + mParentView.getScrollX());
// Call startScroll Method to set the 1 Some scrolling parameters, we are in computeScroll() Method is called in the scrollTo To scroll item
mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
Math.abs(delta));
postInvalidate();
}
/**
* Scroll to the starting position
*/
private void scrollOrigin() {
int delta = mParentView.getScrollX();
mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
Math.abs(delta));
postInvalidate();
}
/**
* touch Adj. View Whether it is AbsListView , For example ListView, GridView Equivalent to its subclass
*
* @return
*/
private boolean isTouchOnAbsListView() {
return touchView instanceof AbsListView ? true : false;
}
/**
* touch Adj. view Whether it is ScrollView Or its subclasses
*
* @return
*/
private boolean isTouchOnScrollView() {
return touchView instanceof ScrollView ? true : false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = tempX = (int) event.getRawX();
downY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) event.getRawX();
int deltaX = tempX - moveX;
tempX = moveX;
if (Math.abs(moveX - downX) > mTouchSlop
&& Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
isSilding = true;
// If touchView Yes AbsListView ,
// Then when the finger slides, cancel item Click event, otherwise we slide along with it item The occurrence of click event
if (isTouchOnAbsListView()) {
MotionEvent cancelEvent = MotionEvent.obtain(event);
cancelEvent
.setAction(MotionEvent.ACTION_CANCEL
| (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
v.onTouchEvent(cancelEvent);
}
}
if (moveX - downX >= 0 && isSilding) {
mParentView.scrollBy(deltaX, 0);
// Shield in sliding process ListView ScrollView Wait for your own sliding event
if (isTouchOnScrollView() || isTouchOnAbsListView()) {
return true;
}
}
break;
case MotionEvent.ACTION_UP:
isSilding = false;
if (mParentView.getScrollX() <= -viewWidth / 2) {
isFinish = true;
scrollRight();
} else {
scrollOrigin();
isFinish = false;
}
break;
}
// Suppose touch Adj. view Yes AbsListView Or ScrollView After we deal with our own logic above,
// And hand it over AbsListView, ScrollView Handle your own logic
if (isTouchOnScrollView() || isTouchOnAbsListView()) {
return v.onTouchEvent(event);
}
// Other situations are returned directly true
return true;
}
@Override
public void computeScroll() {
// Call startScroll At the time of scroller.computeScrollOffset() Return true ,
if (mScroller.computeScrollOffset()) {
mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
if (mScroller.isFinished()) {
if (onSildingFinishListener != null && isFinish) {
onSildingFinishListener.onSildingFinish();
}
}
}
}
public interface OnSildingFinishListener {
public void onSildingFinish();
}
}
2.Acitity
In the onCreate () method of Activity
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.timed_task_SildingFinishLayout);
mSildingFinishLayout
mSildingFinishLayout .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
@Override
public void onSildingFinish() {
finish();
}
});
mSildingFinishLayout .setTouchView(mSildingFinishLayout);// Just bind the underlying layout : If it doesn't work, change to you activity Inside the layout view You can do it
}
Up to now, this function has been implemented
Problem solving: This will cause the problem of sliding left background white
1. style. xml increased in middle
<style name="AppTheme" parent="android:Theme.Light">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
2 Add to the attributes of acvitiy
android:theme="@style/AppTheme"
3 1 Detailed Explanation of Some Attributes
<item name="android:windowFrame">@null</item> : Dialog Adj. windowFrame Box is None
<item name="android:windowIsFloating">true</item> : Does it emerge in activity Above
<item name="android:windowIsTranslucent">false</item>: Is it translucent
<item name="android:windowNoTitle">true</item>: Whether to display title
<item name="android:windowBackground">@drawable/dia_bg</item>: Settings dialog Background of
<item name="android:backgroundDimEnabled">false</item>: Is the background transparent