안 드 로 이 드 는 SlidingPaneLayout 를 사용 하여 위 챗 의 미끄럼 을 되 돌려 줍 니 다.

지난주 에 회사 의 프로젝트 개편 요구 에 오른쪽 미끄럼 을 더 해 이전 화면 으로 돌아 가자 인터넷 에서 오픈 소스 라 이브 러 리 를 찾 아 실현 하려 고 했 지만 사용 할 때 많은 문 제 를 만 났 다.이틀 동안 사용 해 보 았 지만https://github.com/ikew0ng/SwipeBackLayout등 라 이브 러 리 는 성공 하지 못 했다.
그리고https://github.com/r0adkll/Slidr에서 SlidingPane Layout 를 사용 하여 이 루어 진 미끄럼 반환 사례 를 보고 괜 찮 은 것 을 보고 이 걸 사용 했다.
위 링크 에 거의 적 혀 있 지만 코드 를 써 보 세 요.
최종 효과 먼저 보기:

다음 과 같이 구현:
주로 baesActivity 에서...

public class BaesActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener{
 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
 initSlideBackClose();//       
 super.onCreate(savedInstanceState);
 }
 private void initSlideBackClose() {
 if (isSupportSwipeBack()) {
  SlidingPaneLayout slidingPaneLayout = new SlidingPaneLayout(this);
  //       mOverhangSize   0,
  //   mOverhangSize              ,
  //    32dp,      0
  try {
  Field overhangSize = SlidingPaneLayout.class.getDeclaredField("mOverhangSize");
  overhangSize.setAccessible(true);
  overhangSize.set(slidingPaneLayout, 0);
  } catch (Exception e) {
  e.printStackTrace();
  }
  slidingPaneLayout.setPanelSlideListener(this);
  slidingPaneLayout.setSliderFadeColor(getResources()
   .getColor(android.R.color.transparent));
  //        
  View leftView = new View(this);
  leftView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
  slidingPaneLayout.addView(leftView, 0);
  ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
  //        
  ViewGroup decorChild = (ViewGroup) decorView.getChildAt(0);
  decorChild.setBackgroundColor(getResources()
   .getColor(android.R.color.white));
  decorView.removeView(decorChild);
  decorView.addView(slidingPaneLayout);
  //   SlidingPaneLayout       
  slidingPaneLayout.addView(decorChild, 1);
 }
 }
 //          
 protected boolean isSupportSwipeBack() {
 return true;
 }
 @Override
 public void onPanelSlide(View panel, float slideOffset) {
 }
 @Override
 public void onPanelOpened(View panel) {
 finish();
 }
 @Override
 public void onPanelClosed(View panel) {
 }
}
그리고 Acitivity 가 baesActivity 를 이 어 받 게 해 주시 면 됩 니 다.

public class MainActivity extends BaesActivity
효과 좀 봐.

어떻게 이 럴 수가!
그리고 변경 이 필요 한 지 확인 해 보 니 BaesActivity 에 방법 이 적 혀 있 었 습 니 다.

 //          
 protected boolean isSupportSwipeBack() {
 return true;
 }
되 돌아 오지 않 아 도 되 는 인터페이스 에서 이 방법 을 다시 쓰 고 false 로 돌아 가면 됩 니 다.이렇게.

 @Override
 protected boolean isSupportSwipeBack() {
 return false;
 }

메 인 인터페이스 가 미 끄 러 지지 않 는 문제 가 해결 되 었 지만,또 하나의 문제 가 미 끄 러 질 때 왼쪽 에 나타 나 는 것 은 백판 인 데,이것 은 어떻게 깨 집 니까?
설정 해 야 돼 요.  activity 의 style 입 니 다.AndroidManifest.xml 파일 에서 application 을 찾 으 면 노란색 줄 입 니 다.뛰 어 들 기

 <application
 android:name=".MyApplication"
 android:allowBackup="true"
 android:icon="@mipmap/ic_launcher"
 android:label="@string/app_name"
 android:roundIcon="@mipmap/ic_launcher_round"
 android:supportsRtl="true"
 android:theme="@style/AppTheme">//    
 <activity android:name=".MainActivity">
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
 </activity>
 <activity android:name=".TwoActivity"/>
 <activity android:name=".ThreeActivity"/>
 </application>
styles.xml 를 설정 하고 노란색 부분 을 추가 합 니 다.

 <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>
 <!--         -->
 <item name ="android:windowIsTranslucent">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>
 </style>
실행:

우 메 가!내 홈 페이지 가 왜 이렇게 투명 해 졌 지?어떻게
작은 일 은 우리 가 위의 두 줄 을 설 치 했 기 때문에 지금 은 인터페이스의 루트 레이아웃 에 배경 색 을 추가 하면 됩 니 다.

<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"
 android:orientation="vertical"
 android:background="#f2f2f2"
 tools:context="com.mvp.tl.myslidingpanelayoutdemo.MainActivity">
 <Button
 android:id="@+id/next"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="   ,    "
 app:layout_constraintBottom_toBottomOf="parent"
 app:layout_constraintLeft_toLeftOf="parent"
 app:layout_constraintRight_toRightOf="parent"
 app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

OK,초보적인 실현 은 이렇게 되 었 지만,이 효 과 는 너무 추 하 다!
네,이제 Activity 가 열 리 고 닫 힌 스타일 을 바 꾸 겠 습 니 다.
아니면 styles.xml 에서를 수정 합 니까?

 <!-- 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>
 <!--         -->
 <item name ="android:windowIsTranslucent">true</item>
 <item name="android:windowBackground">@android:color/transparent</item>
 <!--activity      -->
 <item name="android:windowAnimationStyle">@style/activityAnimation</item>
 </style>
 <!--activity      -->
<style name="activityAnimation" parent="@android:style/Animation"> 
<item name="android:activityOpenEnterAnimation">@anim/in_from_right</item> 
<item name="android:activityCloseExitAnimation">@anim/out_to_left</item> 
</style> 
anim/in_from_right.xml 와 anim/outto_왼쪽

설정 진행:
in_from_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="500"
 android:fillAfter="true"
 android:fromXDelta="100%p"
 android:interpolator="@android:anim/accelerate_interpolator"
 android:toXDelta="0" />
</set>
out_to_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="500"
 android:fillAfter="true"
 android:fromXDelta="0"
 android:interpolator="@android:anim/accelerate_interpolator"
 android:toXDelta="100%p" />
</set>
그리고 효 과 를 볼 게 요.

OK,효과 가 나 왔 습 니 다.그런데 ViewPager 를 만 났 을 때 는 요?

왜 이래,ViewPager 의 오른쪽 미끄럼 은 사용 할 수 없습니다.SlidingPaneLayout 의 오른쪽 미끄럼 은 ViewPager 의 미끄럼 사건 을 빼 앗 았 습 니 다.어떻게 해 야 합 니까?
사용자 정의 SlidingPaneLayout

import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.widget.SlidingPaneLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
/*
                 ViewPager           ,            
 */
public class PageEnabledSlidingPaneLayout extends SlidingPaneLayout {
 private float mInitialMotionX;
 private float mInitialMotionY;
 private float mEdgeSlop;//      
 public PageEnabledSlidingPaneLayout(Context context) {
 this(context, null);
 }
 public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }
 public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 ViewConfiguration config = ViewConfiguration.get(context);
 mEdgeSlop = config.getScaledEdgeSlop();//getScaledTouchSlop     
 }
 @Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
 switch (MotionEventCompat.getActionMasked(ev)) {
  case MotionEvent.ACTION_DOWN: {
  mInitialMotionX = ev.getX();
  mInitialMotionY = ev.getY();
  break;
  }
  case MotionEvent.ACTION_MOVE: {
  final float x = ev.getX();
  final float y = ev.getY();
  // The user should always be able to "close" the pane, so we only check
  // for child scrollability if the pane is currently closed.
  if (mInitialMotionX > mEdgeSlop && !isOpen() && canScroll(this, false,
   Math.round(x - mInitialMotionX), Math.round(x), Math.round(y))) {
   // How do we set super.mIsUnableToDrag = true?
   // send the parent a cancel event
   MotionEvent cancelEvent = MotionEvent.obtain(ev);
   cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
   return super.onInterceptTouchEvent(cancelEvent);
  }
  }
 }
 return super.onInterceptTouchEvent(ev);
 }
}
그 걸 로 BaesActivity 에 있 는 SlidingPaneLayout 를 교체 해 주시 면 됩 니 다.

OK,최종 효 과 는 이렇게 완성 되 었 습 니 다.
총결산
위 와 같이 소 편 이 소개 한 안 드 로 이 드 는 SlidingPaneLayout 를 사용 하여 위 챗 의 미끄럼 반환 효 과 를 실현 합 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기