android 垂直方向上下滑动阻尼效果
16lz
2021-01-24
在开发过程时,View中需要上下阻尼效果,有网上有很多,直接上代码。
package com.android.feature;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;/** * Created by yuanjl */public class VerticalDampenScrollView extends ScrollView { // Drag the size of the size = 4 only allows to drag the screen 1/4 private static final int size = 4; private View inner; private float y; private Rect normal = new Rect(); private boolean next = false; public interface ScrollViewChangeListener { void onScrollChanged(VerticalDampenScrollView scrollView, int x, int y, int oldx, int oldy); } private ScrollViewChangeListener changeListener = null; public void setChangeListener(ScrollViewChangeListener changeListener) { this.changeListener = changeListener; } public interface ScrollViewListener { void isBottom(boolean isbottom); } private ScrollViewListener scrollViewListener = null; public void setScrollViewListener(ScrollViewListener scrollViewListener) { this.scrollViewListener = scrollViewListener; } public VerticalDampenScrollView(Context context) { super(context); } public VerticalDampenScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { if (getChildCount() > 0) { inner = getChildAt(0); } } @Override public boolean onTouchEvent(MotionEvent ev) { if (inner == null) { return super.onTouchEvent(ev); } else { commOnTouchEvent(ev); } return super.onTouchEvent(ev); } public void commOnTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: next = false; y = ev.getY(); break; case MotionEvent.ACTION_UP: if (isNeedAnimation()) { // Log.v("yuanjl", "will up and animation"); animation(); if (scrollViewListener != null) { scrollViewListener.isBottom(next); } } break; case MotionEvent.ACTION_MOVE: final float preY = y; float nowY = ev.getY(); /** * Size = 4 indicates that the distance to the drag is 1/4 of the height of the screen */ int deltaY = (int) (preY - nowY) / size; // scroll // scrollBy(0, deltaY); y = nowY; // When the scroll to the top or the most when it will not scroll, then move the layout. if (isNeedMove()) { if (normal.isEmpty()) { // Save the normal layout position normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom()); return; } int yy = inner.getTop() - deltaY; if (yy < -100) { next = true; } else { next = false; } // Move the layout inner.layout(inner.getLeft(), yy, inner.getRight(), inner.getBottom() - deltaY); } break; default: break; } } // Turn on animation to move public void animation() { TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top); ta.setDuration(200); inner.startAnimation(ta); // Set back to the normal layout position inner.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); } // Whether you need to turn on animation public boolean isNeedAnimation() { return !normal.isEmpty(); } // Whether you need to move the layout public boolean isNeedMove() { int offset = inner.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); if (scrollY == 0 || scrollY == offset) { return true; } return false; } @Override protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if (changeListener != null) { changeListener.onScrollChanged(this, x, y, oldx, oldy); } }}
android 水平方左右向滑动阻尼效果http://blog.csdn.net/
更多相关文章
- Android实现图片倒影效果
- android动画效果_图片闪烁
- Android实现点击按钮 文本框值加1
- Android实现Flip翻转动画效果
- Android(安卓)Animation Tween动画效果的使用
- android 各种高级素材使用
- Android(安卓)gallery实现二级联动效果
- android控件之spinner (下拉列表)
- Android(安卓)Activity界面切换添加动画特效