日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

發布時間:2024/1/8 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用過iphone的朋友相信都體驗過頁面上拉下拉有一個彈性的效果,使用起來用戶體驗很好;Android并沒有給我們封裝這樣一個效果,我們來看下在Android里如何實現這個效果。先看效果,感覺有些時候還是蠻實用的。

思路:其實原理很簡單,實現一個自定義的Scrollview方法(來自網上大神),然后在布局文件中使用自定義方法Scrollview就可以了。

代碼:

自定義View,繼承自Scrollview。MyReboundScrollView類

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();

}

}

代碼注釋非常清楚。

布局文件直接使用

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">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/et_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="12dip"

android:hint="Your Name"/>

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"/>

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"/>

這里直接在外層包裹實現。注意,因為Myreboundscrollview是繼承自Scrollview,因此要遵循Scrollview的使用原則,里面只能包含一個LinearLayout,所以無論里面多門復雜的布局,最后我們都要將其包含在一個LinearLayout中。

ok,功能實現,效果也演示,具體需要使用直接拿來用就可以。

以上這篇Android仿IOS上拉下拉彈性效果的實例代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持找一找教程網。

總結

以上是生活随笔為你收集整理的android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。