Android 위 챗 오른쪽 슬라이더 기능 구현 코드

먼저 효과 도 를 보 여 드 리 겠 습 니 다.효과 가 좋다 고 느끼 시 면 인 스 턴 스 코드 를 참고 하 세 요.
 
act 2 는 Main2Activity,act 3 는 Main3Activity.
의 원리
굴러가다
먼저,우 리 는 모든 Activity 가 보 여 주 는 내용 이 보통 DecorView 에 실 려 있다 는 것 을 알 고 있 습 니 다.모 르 는 것 은 다음 그림 을 보 세 요.그 중에서 상태 표시 줄 배경 도 포함 되 어 있 습 니 다.
 
DecorView
그래서 우 리 는 첫 번 째 단 계 는 DecorView 내용 을 스크롤 하거나 DecorView 를 평평 하 게 이동 하면 됩 니 다.
이전 Activity 보이 기
위의 액 티 비 티 가 보이 지 않 는 것 은 사실 현재 액 티 비 티 에 의 해 가 려 졌 기 때문이다.그 문제 가 왔 다.
Q:왜 저 는 레이아웃 색상 을 투명 한 배경 으로 설 정 했 는데 위의 Activity 가 보이 지 않 습 니까?
A:위의 DecorView 그림 을 보 세 요.저희 Activity 레이아웃 은 content 안의 내용 만 채 울 뿐 입 니 다.즉,저 희 는 ContentFrameLayout 에 감 싸 여 있 습 니 다.Activity 레이아웃 파일 의 루트 요 소 는 Activity 의 루트 요소 가 아니 라 등급 별로 알 수 있 습 니 다.우리 의 액 티 비 티 는 상부 의 액 티 비 티 에 의 해 가 려 진다.사실은 DecorView 가 배경 색 을 가지 고 있 기 때문에 우 리 는 그것 의 배경 색 만 없 애 면 된다.
이루어지다
첫 번 째 투명 테마 설정

<!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <!-- Customize your theme here. -->
  <item name="colorPrimary">@color/colorPrimary</item>
  <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  <item name="colorAccent">@color/colorAccent</item>
 </style>
 <style name="CustomTheme" parent="AppTheme">
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowBackground">@android:color/transparent</item>
 </style>
<activity android:name=".Main2Activity">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
  <activity
   android:name=".Main3Activity"
   android:theme="@style/CustomTheme" />
우 리 는 Main3Activity 의 DecorView 배경 색 을 지 웠 다.
DecorView 내용 스크롤
여기 서 우 리 는 DecorView 전 체 를 스크롤 하 는 것 이 아니 라 DecorView 내용 을 스크롤 합 니 다.
우선 View 의 ScrollBy 와 ScrollTo 가 무엇 인지 알 아야 합 니 다.참고 하 세 요Android scrollTo 와 scrollBy 방법 사용 설명
Main3Activity.java

public class Main3Activity extends AppCompatActivity {
 /**
  * DecorView           PRESENT_TO_FINISH           Activity
  */
 private static final float PRESENT_TO_FINISH = 0.3f;
 /**
  *       MIN_EDGE_DISTANCE     
  */
 private static final int MIN_EDGE_DISTANCE = 100;
 /**
  *     
  */
 private static float mScreenW = -1;
 /**
  *               
  */
 private float mStartX = 0;
 /**
  *         
  */
 private boolean mIsScrollEnable = false;
 /**
  *   Activity DecorView
  */
 private View mDecorView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main3);
  //    
  mDecorView = getWindow().getDecorView();
  if (mScreenW == -1) {
   DisplayMetrics metrics = new DisplayMetrics();
   getWindowManager().getDefaultDisplay()
     .getMetrics(metrics);
   mScreenW = metrics.widthPixels;
  }
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   mStartX = event.getX();
   if (mStartX < MIN_EDGE_DISTANCE) {
    //          ,        
    mIsScrollEnable = true;
   }
  } else if (event.getAction() == MotionEvent.ACTION_MOVE && mIsScrollEnable) {
   //   DecorView  
   float dX = event.getX() - mStartX;
   mStartX = event.getX();
   mDecorView.scrollBy((int) -dX, 0);
   return true;
  } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
   //       ,  
   mIsScrollEnable = false;
   //                        (  Activity)
   final int targetX = -mDecorView.getScrollX() / mScreenW > PRESENT_TO_FINISH ? (int) -mScreenW : 0;
   ValueAnimator animator = ValueAnimator.ofInt(mDecorView.getScrollX(), targetX);
   animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
     mDecorView.scrollTo((Integer) animation.getAnimatedValue(), 0);
    }
   });
   animator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
    }
    @Override
    public void onAnimationEnd(Animator animation) {
     if (targetX == -mScreenW) {
      finish();
     }
    }
    @Override
    public void onAnimationCancel(Animator animation) {
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
    }
   });
   animator.start();
  }
  return super.onTouchEvent(event);
 }
}
마지막 에 쓰다
이것 은 가장 간단 하고 가장 간단 한 방법 으로 어떠한 포장 과 확장 도 없고 존재 할 수 있 는 스크롤 충돌 도 처리 하지 않 았 다.비교적 완벽 하고 사용 하기 쉬 운 라 이브 러 리 를 패키지 할 수 있 습 니 다.ListView 와 같은 미끄럼 충돌 처리 와 배경 색 투명 그 라 데 이 션 같은 것 을 추가 한 다음 에 xml 코드 를 대응 하 는 deJava 코드 로 변환 할 수 있 습 니 다.한 마디 로 Activity 가 이 기능 을 실현 시 키 는 것 도 할 수 있다.
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 안 드 로 이 드 위 챗 오른쪽 슬라이딩 종료 기능 의 실현 코드 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기