안 드 로 이 드 는 iOS 를 모방 하여 사 이 드 슬라이딩 반환 기능 을 실현 합 니 다(위 챗 과 유사)

사 이 드 슬라이딩 리 턴 작업 은 iOS 에서 흔히 볼 수 있 는 기능 이라는 것 을 잘 알 고 있 습 니 다.보통 손가락 이 핸드폰 화면 왼쪽 에서 오른쪽으로 미 끄 러 지면 현재 화면 을 닫 을 수 있 습 니 다.iOS 시스템 은 이러한 API 를 제공 하지만 Android 는 어떻게 실현 합 니까?인터넷 에서 많은 방법 을 찾 아 비교 해 보 니 개인 적 으로 이것 이 비교적 편리 하고 이해 하기 쉽다 고 생각 합 니 다.
먼저 이전 효과 부터 말 하 자.

의 원리
Activity 자 체 는 미 끄 러 질 수 없 지만,우 리 는 Activity 가 미 끄 러 지고 있 는 것 처럼 보 이 는 가상 을 만 들 수 있 습 니 다.그 원 리 는 매우 간단 하 다.우리 가 미 끄 러 지 는 것 은 Activity 안에 보 이 는 View 요소 이 고 우 리 는 Activity 를 투명 하 게 설정 했다.그러면 View 가 미 끄 러 질 때 Activity 의 밑부분 이 투명 하기 때문에 우 리 는 미 끄 러 지 는 과정 에서 아래 의 Activity 를 볼 수 있다.이렇게 하면 Activity 가 미 끄 러 지 는 것 처럼 보인다.그래서 Activity 슬라이딩 효 과 는 두 단계 로 나 뉜 다.
활동 투명 설정
슬라이딩 뷰
이루어지다
1.투명 설정:
자원 파일 values->styles.xml 에 다음 코드 를 추가 하여 투명 한 테 마 를 만 듭 니 다.

<style name="Transparent" parent="Theme.AppCompat.Light.NoActionBar">
  <item name="android:windowBackground">@android:color/transparent</item>
  <item name="android:windowIsTranslucent">true</item>
</style>
그리고 AndroidManifest.xml 파일 에 해당 하 는 Activity 에 투명 한 테 마 를 설정 합 니 다.예 를 들 어 MainActivity:

<activity
  android:name="com.example.test.MainActivity"
  android:theme="@style/Transparent" >
</activity>
2.슬라이딩 뷰:
먼저 Activity 의 계층 구 조 를 살 펴 보 겠 습 니 다.우리 가 사용 하 는 Activity 의 xml 루트 View 는 Activity 의 루트 View 가 아 닙 니 다.그 위 에 부모 View 가 있 습 니 다.id 는 android.R.id.content 이 고 위로 한 층 더 있 습 니 다.view 는 LinearLayout 입 니 다.우리 가 만 든 View 를 설치 하 는 것 외 에액 션 바 나 제목 표시 줄 같은 xml 이외 의 것 도 설치 합 니 다.그리고 한 단계 더 올 라 가면 Activity 의 뿌리 View―DecorView,구조 에 도착한다.
다음 그림 에서 보 듯 이:

iOS 처럼 전체 Activity 를 미 끄 러 뜨 릴 수 있 도록 하려 면 xml 에서 만 든 View 만 미 끄 러 지 는 것 은 분명 옳지 않 습 니 다.제목 표시 줄,Action Bar 등 이 있 기 때문에 우리 가 미 끄 러 뜨 려 야 할 것 은 DecorView 나 꼴찌 2 층 의 View 입 니 다.
View 를 미 끄 러 뜨리 려 면 부모 창의 onInterceptTouch Event 와 onTouch Event 를 다시 써 야 합 니 다.DecorView 의 생 성 은 우리 가 관여 할 수 있 는 것 이 아니다.
해결 방법 은 우리 스스로 SwipeLayout 를 만 든 다음 에 인위적으로 꼭대기 층 View 에 삽입 하여 DecorView 와 그 아래 의 LinearLayout 중간 에 놓 고 손가락 이 미 끄 러 지면 서 SwipeLayout 의 하위 View―DecorView 의 하위 View―의 위 치 를 계속 바 꾸 면 우 리 는 Activity 의 미끄럼 을 제어 할 수 있다 는 것 이다.Activity 의 onPost Create 방법 에서 swipeLayout.replace Layer 를 호출 하여 SwipeLayout 를 교체 합 니 다.코드 는 다음 과 같 습 니 다.

public void replaceLayer(Activity activity) {

  mActivity = activity;
  screenWidth = getScreenWidth(activity);
  setClickable(true);
  //   Activity     View
  ViewGroup root = (ViewGroup) activity.getWindow().getDecorView();
  //     View        View,     content
  content = root.getChildAt(0);
  ViewGroup.LayoutParams params = content.getLayoutParams();
  ViewGroup.LayoutParams params2 = new ViewGroup.LayoutParams(-1, -1);
  //   View          View   
  root.removeView(content);
  //  content     SwipeLayout
  this.addView(content, params2);
  //   SwipeLayout      View   
  root.addView(this, params);
  sideWidth = (int) (sideWidthInDP * activity.getResources().getDisplayMetrics().density);
}
그리고 이 를 하나의 SwipeActivity 로 써 서 옆으로 미 끄 러 지 는 Activity 가 SwipeActivity 를 계승 하고 SwipeActivity 가 Fragment Activity 나 Activity 를 계승 하도록 요구한다.예 를 들 어 MainActivity:

public class SwipeActivity extends FragmentActivity {
  ...
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }
  ...
}

public class MainActivity extends SwipeActivity {
  ...
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  }
  ...
}
총결산
사실 업무 중 에 하나의 프로젝트 를 개발 하면 기본적으로 하나의 BaseActivity 를 패키지 합 니 다.BaseActivity 가 SwipeActivity 를 계승 하면 BaseActivity 를 계승 하 는 모든 Activity 가 사 이 드 스 케 이 트 를 실현 할 수 있 습 니 다.이 기능 을 실현 하지 않 아 도 되 는 방법 이 있 으 면 SwipeActivity 안의 한 가지 방법 만 호출 할 수 있 습 니 다.
public void set Swipe Enabled(boolean swipe Enabled)매개 변 수 를 false 로 전송 하면 됩 니 다.너무 편 하지 않 아 요?
사실 또 다른 방법 이 드 러 났 다.
public void set SwipeAny Where(boolean swipeAny Where)는 화면의 임의의 위치 에서 오른쪽으로 미 끄 러 질 지 여 부 를 설정 합 니 다.기본적으로 왼쪽 가장자리 에서 오른쪽으로 만 미 끄 러 질 수 있 기 때 문 입 니 다.
마지막.
원 github 첨부:https://github.com/NashLegend/SwipetoFinishActivity
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기