안 드 로 이 드 는 IOS 에서 신축성 효 과 를 끌 어 내 리 는 인 스 턴 스 코드 를 모방 합 니 다.

아이 폰 을 사용 해 본 친구 들 은 페이지 를 끌 어 내 리 는 것 이 탄력 적 인 효과 가 있다 고 믿 고 사용 하면 사용자 체험 이 좋다.Android 는 이러한 효 과 를 패키지 해 주지 않 았 습 니 다.Android 에서 이 효 과 를 어떻게 실현 하 는 지 살 펴 보 겠 습 니 다.효 과 를 먼저 보면 가끔 실 용적 인 것 같 아 요.

사고방식:사실 원 리 는 매우 간단 합 니 다.사용자 정의 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 상하 당 김 탄성 효과 의 인 스 턴 스 코드 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기