android自定義滾動上下回彈scollView
本文實例為大家分享了android自定義滾動上下回彈scollView的具體代碼,供大家參考,具體內(nèi)容如下
這是一個自定義view,在xml布局中用這個view嵌套要使之可以上下回彈的view
就能實現(xiàn)布局可以滾動上下回彈了,自定義view代碼如下:
package com.loopfire.meitaotao.view.scrollView; ? import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.TranslateAnimation; import android.widget.ScrollView; ? /** ?* 上下回彈 scollView ?*? ?* @author Administrator ?*? ?*/ public class MyScrollView extends ScrollView { ?? ?private View inner; ?? ?private float y; ?? ?private Rect normal = new Rect(); ?? ?private boolean animationFinish = true; ? ?? ?public MyScrollView(Context context) { ?? ??? ?super(context); ?? ?} ? ?? ?public MyScrollView(Context context, AttributeSet attrs) { ?? ??? ?super(context, attrs); ?? ?} ? ?? ?@Override ?? ?protected void onFinishInflate() { ?? ??? ?if (getChildCount() > 0) { ?? ??? ??? ?inner = getChildAt(0); ?? ??? ?} ?? ?} ? ?? ?@Override ?? ?public boolean onInterceptTouchEvent(MotionEvent ev) { ?? ??? ?return super.onInterceptTouchEvent(ev); ?? ?} ? ?? ?@Override ?? ?public boolean onTouchEvent(MotionEvent ev) { ?? ??? ?if (inner == null) { ?? ??? ??? ?return super.onTouchEvent(ev); ?? ??? ?} else { ?? ??? ??? ?commOnTouchEvent(ev); ?? ??? ?} ?? ??? ?return super.onTouchEvent(ev); ?? ?} ? ?? ?private void commOnTouchEvent(MotionEvent ev) { ?? ??? ?if (animationFinish) { ?? ??? ??? ?int action = ev.getAction(); ?? ??? ??? ?switch (action) { ?? ??? ??? ?case MotionEvent.ACTION_DOWN: ?? ??? ??? ??? ?// System.out.println("ACTION_DOWN"); ?? ??? ??? ??? ?y = ev.getY(); ?? ??? ??? ??? ?super.onTouchEvent(ev); ?? ??? ??? ??? ?break; ?? ??? ??? ?case MotionEvent.ACTION_UP: ?? ??? ??? ??? ?// System.out.println("ACTION_UP"); ?? ??? ??? ??? ?y = 0; ?? ??? ??? ??? ?if (isNeedAnimation()) { ?? ??? ??? ??? ??? ?animation(); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?super.onTouchEvent(ev); ?? ??? ??? ??? ?break; ?? ??? ??? ?case MotionEvent.ACTION_MOVE: ?? ??? ??? ??? ?// System.out.println("ACTION_MOVE"); ?? ??? ??? ??? ?final float preY = y == 0 ? ev.getY() : y; ?? ??? ??? ??? ?float nowY = ev.getY(); ?? ??? ??? ??? ?int deltaY = (int) (preY - nowY); ?? ??? ??? ??? ?// 滾動 ?? ??? ??? ??? ?// scrollBy(0, deltaY); ? ?? ??? ??? ??? ?y = nowY; ?? ??? ??? ??? ?// 當滾動到最上或者最下時就不會再滾動,這時移動布局 ?? ??? ??? ??? ?if (isNeedMove()) { ?? ??? ??? ??? ??? ?if (normal.isEmpty()) { ?? ??? ??? ??? ??? ??? ?// 保存正常的布局位置 ?? ??? ??? ??? ??? ??? ?normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom()); ?? ??? ??? ??? ??? ?} ?? ??? ??? ??? ??? ?// 移動布局 ?? ??? ??? ??? ??? ?inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2); ?? ??? ??? ??? ?} else { ?? ??? ??? ??? ??? ?super.onTouchEvent(ev); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?break; ?? ??? ??? ?default: ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ?} ?? ?} ? ?? ?// 開啟動畫移動 ? ?? ?private void animation() { ?? ??? ?// 開啟移動動畫 ?? ??? ?TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop()); ?? ??? ?ta.setDuration(200); ?? ??? ?ta.setAnimationListener(new AnimationListener() { ?? ??? ??? ?@Override ?? ??? ??? ?public void onAnimationStart(Animation animation) { ?? ??? ??? ??? ?animationFinish = false; ? ?? ??? ??? ?} ? ?? ??? ??? ?@Override ?? ??? ??? ?public void onAnimationRepeat(Animation animation) { ? ?? ??? ??? ?} ? ?? ??? ??? ?@Override ?? ??? ??? ?public void onAnimationEnd(Animation animation) { ?? ??? ??? ??? ?inner.clearAnimation(); ?? ??? ??? ??? ?// 設(shè)置回到正常的布局位置 ?? ??? ??? ??? ?inner.layout(normal.left, normal.top, normal.right, normal.bottom); ?? ??? ??? ??? ?normal.setEmpty(); ?? ??? ??? ??? ?animationFinish = true; ?? ??? ??? ?} ?? ??? ?}); ?? ??? ?inner.startAnimation(ta); ?? ?} ? ?? ?// 是否需要開啟動畫 ?? ?private boolean isNeedAnimation() { ?? ??? ?return !normal.isEmpty(); ?? ?} ? ?? ?// 是否需要移動布局 ?? ?private boolean isNeedMove() { ?? ??? ?int offset = inner.getMeasuredHeight() - getHeight(); ?? ??? ?int scrollY = getScrollY(); ?? ??? ?if (scrollY == 0 || scrollY == offset) { ?? ??? ??? ?return true; ?? ??? ?} ?? ??? ?return false; ?? ?} ? }
在xml中使用如下:
<com.loopfire.meitaotao.view.scrollView.MyScrollView> ? ? ? ? ? <TextView ? ? ? ? ? ? ? style="@style/form_left_text_style" ? ? ? ? ? ? ? android:layout_width="wrap_content" ? ? ? ? ? ? ? android:layout_height="wrap_content" ? ? ? ? ? ? ? android:layout_marginLeft="@dimen/text_margin_left2" ? ? ? ? ? ? ? android:text="@string/about" /> </com.loopfire.meitaotao.view.scrollView.MyScrollView>
那么包含的這個textview可以上下滾動并且回彈了
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android listview ExpandableListView實現(xiàn)多選,單選,全選,edittext實現(xiàn)批量輸入
這篇文章主要介紹了Android listview ExpandableListView實現(xiàn)多選,單選,全選,edittext實現(xiàn)批量輸入的實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-01-01Android實現(xiàn)bitmap指定區(qū)域滑動截取功能
這篇文章主要為大家詳細介紹了Android實現(xiàn)bitmap指定區(qū)域滑動截取功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09詳解Kotlin Android開發(fā)中的環(huán)境配置
這篇文章主要介紹了詳解Kotlin Android開發(fā)中的環(huán)境配置的相關(guān)資料,需要的朋友可以參考下2017-06-06詳解Android studio 動態(tài)fragment的用法
這篇文章主要介紹了Android studio 動態(tài)fragment的用法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10