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