Android ScrollView 의 상단 드 롭 다운 과 하단 드 롭 다운 효과
8593 단어 scrollview리 턴
Android 의 View 이벤트 배포 처리 체제 에 따라 dispatchTouchEvent 에 대해 상세 하 게 분석 하 겠 습 니 다.
마 운 트 레이아웃 이 완 료 된 후 ScrollView 의 첫 번 째 키 요 소 를 가 져 와 파 라 메 터 를 저장 합 니 다.left top right bottom 파 라 메 터 는 상단 드 롭 다운 동작 과 아래쪽 드 롭 다운 동작 에 따라 하위 View 의 레이아웃 파 라 메 터 는 미끄럼 거리 에 따라 변 경 됩 니 다.ACTIONUP 에 서 는 리 턴 이 있 는 지 여 부 를 판단 하고 필요 하면 애니메이션 리 턴 을 원래 위치 로 리 턴 하면 리 턴 을 추가 해 감청 을 끝 낼 수 있다.예 를 들 어 리 턴 처리 가 다른 페이지 로 넘 어 가 는 동작 등 이다.
구체 적 으로 다음 과 같이 상단 과 아래쪽 리 턴 을 사용 하지 않 을 지 여부 의 매개 변수 설정 과 리 턴 효과 가 감청 을 끝 낼 지 여 부 를 추가 합 니 다.
/**
* A Simple Rebound ScrollView
* @author Denluoyia
*/
public class ReboundScrollView extends ScrollView{
private boolean mEnableTopRebound = true;
private boolean mEnableBottomRebound = true;
private OnReboundEndListener mOnReboundEndListener;
private View mContentView;
private Rect mRect = new Rect();
public ReboundScrollView(Context context) {
super(context);
}
public ReboundScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ReboundScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/** after inflating view, we can get the width and height of view */
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mContentView = getChildAt(0);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (mContentView == null) return;
// to remember the location of mContentView
mRect.set(mContentView.getLeft(), mContentView.getTop(), mContentView.getRight(), mContentView.getBottom());
}
public ReboundScrollView setOnReboundEndListener(OnReboundEndListener onReboundEndListener){
this.mOnReboundEndListener = onReboundEndListener;
return this;
}
public ReboundScrollView setEnableTopRebound(boolean enableTopRebound){
this.mEnableTopRebound = enableTopRebound;
return this;
}
public ReboundScrollView setEnableBottomRebound(boolean mEnableBottomRebound){
this.mEnableBottomRebound = mEnableBottomRebound;
return this;
}
private int lastY;
private boolean rebound = false;
private int reboundDirection = 0; //<0 >0 0
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (mContentView == null){
return super.dispatchTouchEvent(ev);
}
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
lastY = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
if (!isScrollToTop() && !isScrollToBottom()){
lastY = (int) ev.getY();
break;
}
//
int deltaY = (int) (ev.getY() - lastY);
//deltaY > 0 deltaY < 0
//disable top or bottom rebound
if ((!mEnableTopRebound && deltaY > 0) || (!mEnableBottomRebound && deltaY < 0)){
break;
}
int offset = (int) (deltaY * 0.48);
mContentView.layout(mRect.left, mRect.top + offset, mRect.right, mRect.bottom + offset);
rebound = true;
break;
case MotionEvent.ACTION_UP:
if (!rebound) break;
reboundDirection = mContentView.getTop() - mRect.top;
TranslateAnimation animation = new TranslateAnimation(0, 0, mContentView.getTop(), mRect.top);
animation.setDuration(300);
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (mOnReboundEndListener != null){
if (reboundDirection > 0){
mOnReboundEndListener.onReboundTopComplete();
}
if (reboundDirection < 0){
mOnReboundEndListener.onReboundBottomComplete();
}
reboundDirection = 0;
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mContentView.startAnimation(animation);
mContentView.layout(mRect.left, mRect.top, mRect.right, mRect.bottom);
rebound = false;
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public void setFillViewport(boolean fillViewport) {
super.setFillViewport(true); // ScrollView XML fillViewport
}
/**
* ScrollView
*/
private boolean isScrollToTop(){
return getScrollY() == 0;
}
/**
* ScrollView
*/
private boolean isScrollToBottom(){
return mContentView.getHeight() <= getHeight() + getScrollY();
}
/**
* listener for top and bottom rebound
* do your implement in the following methods
*/
public interface OnReboundEndListener{
void onReboundTopComplete();
void onReboundBottomComplete();
}
}
사용:XML 레이아웃 파일 에서 ScrollView 를 Rebound ScrollView 로 바 꾸 면 됩 니 다.리 턴 상단 과 아래쪽 에 다른 애니메이션 효 과 를 추가 할 수도 있 습 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".TestActivity">
<com.denluoyia.dtils.widget.ReboundScrollView
android:id="@+id/reboundScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#eefade"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="15sp"
android:lineSpacingExtra="5dp"
android:text="@string/content"/>
</LinearLayout>
</com.denluoyia.dtils.widget.ReboundScrollView>
</LinearLayout>
리 턴 을 사용 하지 않 으 려 면 enableTopRebound 와 enableBottomRebound 인 자 를 직접 설정 하고 리 턴 종료(또는 시작)감청 을 설정 할 수 있 습 니 다.
public class TestActivity extends AppCompatActivity {
private ReboundScrollView reboundScrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
reboundScrollView = findViewById(R.id.reboundScrollView);
//reboundScrollView.setEnableTopRebound(false);
//reboundScrollView.setEnableBottomRebound(false);
reboundScrollView.setOnReboundEndListener(new ReboundScrollView.OnReboundEndListener() {
@Override
public void onReboundTopComplete() {
Toast.makeText(TestActivity.this, " ", Toast.LENGTH_SHORT).show();
}
@Override
public void onReboundBottomComplete() {
Toast.makeText(TestActivity.this, " ", Toast.LENGTH_SHORT).show();
}
});
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 디자인 모드 - 리 셋 함수 와 관찰자 모드안 드 로 이 드 의 프레임 워 크 에는 액 티 비 티 의 라 이 프 사이클, 버튼 클릭 이벤트 등 리 셋 모드 를 사용 하 는 곳 이 매우 많다. 다음은 리 셋 의 기본 모델 입 니 다. 클래스 A 를 Button...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.