안 드 로 이 드 는 IOS 에서 신축성 효 과 를 끌 어 내 리 는 인 스 턴 스 코드 를 모방 합 니 다.
사고방식:사실 원 리 는 매우 간단 합 니 다.사용자 정의 Scrollview 방법(인터넷 에서 온 신)을 실현 한 다음 에 레이아웃 파일 에서 사용자 정의 방법 Scrollview 를 사용 하면 됩 니 다.
코드:
스크롤 뷰 에서 계승 할 View 를 사용자 정의 합 니 다.MyRebound ScrollView 클래스
package com.wj.myreboundscrollview.customview;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
// ios ScrollView
public class MyReboundScrollView extends ScrollView {
private static final String TAG = "ElasticScrollView";
// , , 100px, View 50px
//
private static final float MOVE_FACTOR = 0.5f;
// ,
private static final int ANIM_TIME = 100;
//ScrollView View, ScrollView View
private View contentView;
// Y ,
// , Y
private float startY;
//
private Rect originalRect = new Rect();
//
private boolean canPullDown = false;
//
private boolean canPullUp = false;
//
private boolean isMoved = false;
public MyReboundScrollView(Context context) {
super(context);
}
public MyReboundScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
if (getChildCount() > 0) {
contentView = getChildAt(0);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if(contentView == null) return;
//ScrollView ,
originalRect.set(contentView.getLeft(), contentView.getTop(), contentView
.getRight(), contentView.getBottom());
}
// ,
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (contentView == null) {
return super.dispatchTouchEvent(ev);
}
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
//
canPullDown = isCanPullDown();
canPullUp = isCanPullUp();
// Y
startY = ev.getY();
break;
case MotionEvent.ACTION_UP:
if(!isMoved) break; // ,
//
TranslateAnimation anim = new TranslateAnimation(0, 0, contentView.getTop(),
originalRect.top);
anim.setDuration(ANIM_TIME);
contentView.startAnimation(anim);
//
contentView.layout(originalRect.left, originalRect.top,
originalRect.right, originalRect.bottom);
// false
canPullDown = false;
canPullUp = false;
isMoved = false;
break;
case MotionEvent.ACTION_MOVE:
// , ,
if(!canPullDown && !canPullUp) {
startY = ev.getY();
canPullDown = isCanPullDown();
canPullUp = isCanPullUp();
break;
}
//
float nowY = ev.getY();
int deltaY = (int) (nowY - startY);
//
boolean shouldMove =
(canPullDown && deltaY > 0) // ,
|| (canPullUp && deltaY< 0) // ,
|| (canPullUp && canPullDown); // ( ScrollView ScrollView )
if(shouldMove){
//
int offset = (int)(deltaY * MOVE_FACTOR);
//
contentView.layout(originalRect.left, originalRect.top + offset,
originalRect.right, originalRect.bottom + offset);
isMoved = true; //
}
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
//
private boolean isCanPullDown() {
return getScrollY() == 0 ||
contentView.getHeight() < getHeight() + getScrollY();
}
//
private boolean isCanPullUp() {
return contentView.getHeight() <= getHeight() + getScrollY();
}
}
코드 주석 이 매우 명확 하 다.레이아웃 파일 직접 사용
<com.wj.myreboundscrollview.customview.MyReboundScrollView
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"
tools:context=".MainActivity"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dip"
android:hint="Your Name"/>
<EditText
android:id="@+id/et_feedback"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dip"
android:hint="Your Feedback"
android:lines="5"/>
<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="42dip"
android:text="Submit"
android:onClick="submit"/>
</LinearLayout>
</com.wj.myreboundscrollview.customview.MyReboundScrollView>
이곳 은 바로 바깥쪽 소포 에서 이 루어 진다.Myreboundscrollview 는 Scrollview 에서 계승 하 는 것 이기 때문에 Scrollview 의 사용 원칙 에 따라 하나의 LinearLayout 만 포함 할 수 있 습 니 다.그 렇 기 때문에 안의 여러 개의 복잡 한 구 조 를 막론하고 마지막 으로 우 리 는 이 를 하나의 LinearLayout 에 포함 시 켜 야 합 니 다.ok,기능 이 실현 되 고 효과 도 보 여 줍 니 다.구체 적 으로 사용 하려 면 직접 가 져 와 서 사용 하면 됩 니 다.
이상 의 안 드 로 이 드 모방 IOS 상하 당 김 탄성 효과 의 인 스 턴 스 코드 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.