Android Activity 사 이 드 슬라이딩 반환 의 실현 원 리 를 분석 하 다.
8766 단어 androidActivity옆으로 미끄러지다.
사 이 드 슬라이딩 Activity 를 사용 하여 되 돌아 오 는 것 은 흔 하 다.예 를 들 어 위 챗 에서 사용 된다.그럼 어떻게 이 루어 졌 을 까?본문 은 너 를 데 리 고 실현 원 리 를 분석 해 보 자.나 는 github 에서 스타 가 2.6k 의 개원 을 찾 았 는데,우 리 는 그 가 어떻게 실현 되 었 는 지 분석 했다.
//star 2.6k
'com.r0adkll:slidableactivity:2.0.5'
Slidr 사용 예시사용 은 간단 합 니 다.먼저 투명 한 창 배경 을 설정 해 야 합 니 다.
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:textAllCaps">false</item>
<item name="android:windowActionBar">false</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<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>
그리고
//setContent(View view)
Slidr.attach(this);
다음은 세 단계 에서 그 원 리 를 볼 수 있다.
단계 1 재 패키지 인터페이스
Slidr.class
public static SlidrInterface attach(final Activity activity, final int statusBarColor1, final int statusBarColor2){
//0 SliderPanel
final SliderPanel panel = initSliderPanel(activity, null);
//7 Set the panel slide listener for when it becomes closed or opened
//
panel.setOnPanelSlideListener(new SliderPanel.OnPanelSlideListener() {
...
//open close
});
// Return the lock interface
return initInterface(panel);
}
private static SliderPanel initSliderPanel(final Activity activity, final SlidrConfig config) {
//3 decorview
ViewGroup decorView = (ViewGroup)activity.getWindow().getDecorView();
//4
View oldScreen = decorView.getChildAt(0);
decorView.removeViewAt(0);
//5 Setup the slider panel and attach it to the decor
// SliderPanel DecorView
SliderPanel panel = new SliderPanel(activity, oldScreen, config);
panel.setId(R.id.slidable_panel);
oldScreen.setId(R.id.slidable_content);
//6 SliderPanel, SliderPanel decorView
panel.addView(oldScreen);
decorView.addView(panel, 0);
return panel;
}
STEP 2 사용ViewDragHelper.class
미끄럼 제스처 처리SliderPanel.class
private void init(){
...
//1 ViewDragHelper
mDragHelper = ViewDragHelper.create(this, mConfig.getSensitivity(), callback);
mDragHelper.setMinVelocity(minVel);
mDragHelper.setEdgeTrackingEnabled(mEdgePosition);
//2 Setup the dimmer view View
mDimView = new View(getContext());
mDimView.setBackgroundColor(mConfig.getScrimColor());
mDimView.setAlpha(mConfig.getScrimStartAlpha());
addView(mDimView);
}
3 단계 뷰 드 래 곤 Helper.Callback 에서 우리 인터페이스의 드래그 를 처리 합 니 다.우선 View DragHelper 는 ParentView 와 하위 View 의 관 계 를 처리 하 는 것 일 뿐 맨 위 에 있 는 View 까지 옮 겨 다 니 지 않 습 니 다.View DragHelper 의 포획 capture 는 이렇게 이 루어 집 니 다.
@Nullable
public View findTopChildUnder(int x, int y) {
final int childCount = mParentView.getChildCount();
for (int i = childCount - 1; i >= 0; i--) {
final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i));
if (x >= child.getLeft() && x < child.getRight()
&& y >= child.getTop() && y < child.getBottom()) {
return child;
}
}
return null;
}
SliderPanel.class ViewDragHelper.Callback callback
의 실현 에 중심 을 두 고 저 자 는 여러 방향의 미끄럼 처리 mLeft Callback,mRightCallback,mTopCallback,mBottomCallback,mVertical Callback,mHorizontal Callback 을 실현 했다.우 리 는 mLeft Callback 을 이용 하여 분석 했다.
private ViewDragHelper.Callback mLeftCallback = new ViewDragHelper.Callback() {
// View
@Override
public boolean tryCaptureView(View child, int pointerId) {
boolean edgeCase = !mConfig.isEdgeOnly() || mDragHelper.isEdgeTouched(mEdgePosition, pointerId);
// , View,mDecorView contentView
return child.getId() == mDecorView.getId() && edgeCase;
}
// , view.offsetLeftAndRight(offset)
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return clamp(left, 0, mScreenWidth);
}
//
@Override
public int getViewHorizontalDragRange(View child) {
return mScreenWidth;
}
// ,
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
int left = releasedChild.getLeft();
int settleLeft = 0;
int leftThreshold = (int) (getWidth() * mConfig.getDistanceThreshold());
boolean isVerticalSwiping = Math.abs(yvel) > mConfig.getVelocityThreshold();
if(xvel > 0){
if(Math.abs(xvel) > mConfig.getVelocityThreshold() && !isVerticalSwiping){
settleLeft = mScreenWidth;
}else if(left > leftThreshold){
settleLeft = mScreenWidth;
}
}else if(xvel == 0){
if(left > leftThreshold){
settleLeft = mScreenWidth;
}
}
// left=0( ) left=mScreenWidth( ) Activity
mDragHelper.settleCapturedViewAt(settleLeft, releasedChild.getTop());
invalidate();
}
// ,
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
float percent = 1f - ((float)left / (float)mScreenWidth);
if(mListener != null) mListener.onSlideChange(percent);
// Update the dimmer alpha
applyScrim(percent);
}
// Slidr Activity
@Override
public void onViewDragStateChanged(int state) {
super.onViewDragStateChanged(state);
if(mListener != null) mListener.onStateChanged(state);
switch (state){
case ViewDragHelper.STATE_IDLE:
if(mDecorView.getLeft() == 0){
// State Open
if(mListener != null) mListener.onOpened();
}else{
// State Closed Slidr activity.finish()
if(mListener != null) mListener.onClosed();
}
break;
case ViewDragHelper.STATE_DRAGGING:
break;
case ViewDragHelper.STATE_SETTLING:
break;
}
}
};
mDragHelper.settleCapturedViewAt(settleLeft, releasedChild.getTop());
내 부 는 Scroller.class 보조 스크롤 을 사용 하기 때문에SliderPanel
에 다시 쓰기View.computeScroll()
@Override
public void computeScroll() {
super.computeScroll();
if(mDragHelper.continueSettling(true)){
ViewCompat.postInvalidateOnAnimation(this);
}
}
총결산전체 방안 은 아래 그림 과 같다.
전체적으로 보면 원 리 는 복잡 하지 않 고 뷰 드 래 곤 헬 퍼 를 통 해 뷰 를 끌 어 당 기 는 것 이다.
이상 은 바로 Android Activity 사 이 드 슬라이딩 반환 의 실현 원리 에 대한 상세 한 내용 입 니 다.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에 따라 라이센스가 부여됩니다.