안 드 로 이 드 는 SlidingPaneLayout 를 사용 하여 위 챗 의 미끄럼 을 되 돌려 줍 니 다.
그리고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 를 사용 하여 위 챗 의 미끄럼 반환 효 과 를 실현 합 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.