Android 에서 Activity 슬라이딩 종료 효과

최근 에 Activity 가 닫 히 는 효과 가 좋 은 것 같 습 니 다.바로 제스처 가 미 끄 러 지면 현재 Activity 를 닫 을 수 있 습 니 다.그래서 블 로 그 를 써 서 여러분 과 함께 공유 하고 싶 습 니 다!쓸데없는 말 은 많이 하지 않 고,낡은 규칙 은 먼저 효과 도 를 올 리 고,더욱 직관 적 이다!
这里写图片描述
프로젝트 주소:https://github.com/xinyitiandi/SlidingFinishDemo
상위 코드:
1.첫 번 째 액 티 비 티:

package com.ekeguan.slidingfinishdemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private Button button;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
  initEventListener();
 }
 private void initView() {
  button = (Button) findViewById(R.id.button);
 }
 private void initEventListener() {
  button.setOnClickListener(this);
 }
 @Override
 public void onClick(View view) {
  switch(view.getId())
  {
   case R.id.button:
    startActivity(new Intent(MainActivity.this,SecondActivity.class));
    break;
   default:
    break;
  }
 }
}
레이아웃 파일:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.ekeguan.slidingfinishdemo.MainActivity">
 <Button
  android:id="@+id/button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="      Activity"
  app:layout_constraintBottom_toBottomOf="parent"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent"
  app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
2.두 번 째 액 티 비 티,즉 점프 할 목표 액 티 비 티

package com.ekeguan.slidingfinishdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
 private SildingFinishLayout mSildingFinishLayout;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_second);
  initView();
  initEventListener();
 }
 private void initView() {
  mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.sildingFinishLayout);
  mSildingFinishLayout.setTouchView(mSildingFinishLayout);
 }
 private void initEventListener() {
  mSildingFinishLayout
    .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
     @Override
     public void onSildingFinish() {
      finish();
     }
    });
 }
}
레이아웃 파일:

<?xml version="1.0" encoding="utf-8"?>
<com.ekeguan.slidingfinishdemo.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/sildingFinishLayout"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center">
 <FrameLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#f0f0f0">
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="        Activity"
   android:layout_gravity="center"
   android:textColor="#000"/>
 </FrameLayout>
</com.ekeguan.slidingfinishdemo.SildingFinishLayout>
메모:사용자 정의 레이아웃 인 Silding Finish Layout 를 사 용 했 습 니 다.이 레이아웃 에 대한 코드 는 제 가 잠시 후에 아래 에 붙 일 테 니 조급해 하지 마 세 요.주의해 야 할 것 은 미 끄 러 지고 닫 으 려 는 Activity 의 레이아웃 파일 의 맨 바깥쪽 은 Silding FinishLayout 레이아웃 으로 감 싸 고 Silding FinishLayout 에 감 싸 인 안의 레이아웃 은 배경 색 을 설정 하 는 것 입 니 다.예 를 들 어 FrameLayout 와 같이 저 는 배경 색 을'\#f0f0f 0 f0'으로 설 치 했 습 니 다.글꼴 은 TextView 와 같이'\#000'을 설 치 했 습 니 다.
이상 적 인 효 과 를 얻 기 위해 AndroidMainfest.xml 파일 에 손짓 으로 미 끄 러 지 려 는 Activity 에 투명 한 테 마 를 추가 해 야 합 니 다.예 를 들 어:

<activity android:name=".SecondActivity"
   android:screenOrientation="portrait"
   android:theme="@style/Theme.AppCompat.Translucent"></activity>
테마:

<style name="Theme.AppCompat.Translucent">
  <item name="android:windowBackground">@android:color/transparent</item>
  <item name="android:colorBackgroundCacheHint">@null</item>
  <item name="android:windowIsTranslucent">true</item>
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>
 </style>
자,여기까지 차이 가 많 지 않 습 니 다.다음은 사용자 정의 레이아웃 Silding Finish Layout 코드 를 붙 입 니 다.

package com.ekeguan.slidingfinishdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.Scroller;
/**
 *         RelativeLayout,    IOS         ,      
 *       ,    Activity        SildingFinishLayout,
 *       setTouchView()          View
 *
 * @author xiaanming
 *
 * @blog http://blog.csdn.net/xiaanming
 *
 */
public class SildingFinishLayout extends RelativeLayout implements
  OnTouchListener {
 /**
  * SildingFinishLayout      
  */
 private ViewGroup mParentView;
 /**
  *        View
  */
 private View touchView;
 /**
  *        
  */
 private int mTouchSlop;
 /**
  *     X  
  */
 private int downX;
 /**
  *     Y  
  */
 private int downY;
 /**
  *     X  
  */
 private int tempX;
 /**
  *    
  */
 private Scroller mScroller;
 /**
  * SildingFinishLayout   
  */
 private int viewWidth;
 /**
  *         
  */
 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) {
   //   SildingFinishLayout        
   mParentView = (ViewGroup) this.getParent();
   viewWidth = this.getWidth();
  }
 }
 /**
  *   OnSildingFinishListener,  onSildingFinish()   finish Activity
  *
  * @param onSildingFinishListener
  */
 public void setOnSildingFinishListener(
   OnSildingFinishListener onSildingFinishListener) {
  this.onSildingFinishListener = onSildingFinishListener;
 }
 /**
  *   Touch View
  *
  * @param touchView
  */
 public void setTouchView(View touchView) {
  this.touchView = touchView;
  touchView.setOnTouchListener(this);
 }
 public View getTouchView() {
  return touchView;
 }
 /**
  *      
  */
 private void scrollRight() {
  final int delta = (viewWidth + mParentView.getScrollX());
  //   startScroll            ,   computeScroll()     scrollTo   item
  mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
    Math.abs(delta));
  postInvalidate();
 }
 /**
  *        
  */
 private void scrollOrigin() {
  int delta = mParentView.getScrollX();
  mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
    Math.abs(delta));
  postInvalidate();
 }
 /**
  * touch View   AbsListView,   ListView, GridView    
  *
  * @return
  */
 private boolean isTouchOnAbsListView() {
  return touchView instanceof AbsListView ? true : false;
 }
 /**
  * touch view   ScrollView     
  *
  * @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;
     //  touchView AbsListView,
     //       ,  item     ,          item       
     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);
     //         ListView ScrollView        
     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;
  }
  //   touch view AbsListView  ScrollView               
  //    AbsListView, ScrollView          
  if (isTouchOnScrollView() || isTouchOnAbsListView()) {
   return v.onTouchEvent(event);
  }
  //          true
  return true;
 }
 @Override
 public void computeScroll() {
  //   startScroll   scroller.computeScrollOffset()  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();
 }
}
마지막 항목 주소:https://github.com/xinyitiandi/SlidingFinishDemo
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 안 드 로 이 드 에서 Activity 슬라이딩 이 꺼 지 는 효과 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기