自己的ScrollView实现反弹效果
来源:互联网 发布:有限元法的软件 编辑:程序博客网 时间:2024/04/30 15:23
public class MyScrollView extends ScrollView {private View inner; //孩子View private boolean isCount = false;// 是否开始计算 private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.) private float y;// 点击时y坐标 public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);}/*** * 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate * 方法,也应该调用父类的方法,使该方法得以执行. */ @Overrideprotected void onFinishInflate() {if (getChildCount() > 0) { inner = getChildAt(0); // 获取其孩子 } }/*** * 监听touch */@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(inner!=null){//Toast.makeText(getContext(), "监听touch ", 1).show();commOnTouchEvent(ev); }return super.onTouchEvent(ev);}/*** * 触摸事件 * * @param ev */ private void commOnTouchEvent(MotionEvent ev) {int action = ev.getAction(); switch (action){case MotionEvent.ACTION_DOWN: y = ev.getY();// 获取点击y坐标 break; case MotionEvent.ACTION_UP: // 手指松开. if(isNeedAnimation()){System.out.println("手指松开. ");animation(); isCount = false; }break; /*** * 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到, * 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始. * 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行. */ case MotionEvent.ACTION_MOVE: final float preY = y;// 按下时的y坐标 float nowY = ev.getY();// 时时y坐标 int deltaY = (int) (preY - nowY);// 滑动距离 if (!isCount) { deltaY = 0; // 在这里要归0. } y = nowY; // 当滚动到最上或者最下时就不会再滚动,这时移动布局 if (isNeedMove()) { // 初始化头部矩形 if (normal.isEmpty()) { // 保存正常的布局位置 normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom()); } Log.e("kk", "矩形:" + inner.getLeft() + "," + inner.getTop() + "," + inner.getRight() + "," + inner.getBottom()); // 移动布局 inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2); } isCount = true; break; }}/*** * 回缩动画 */ private void animation() {// 开启移动动画 TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top); ta.setDuration(200); inner.startAnimation(ta); // 设置回到正常的布局位置 inner.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); // 清空矩形 }/*** * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度 * * getHeight():获取的是屏幕的高度 * * @return */ private boolean isNeedMove() {int offset = inner.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); Log.e("kk", "scrolly=" + scrollY); // 0是顶部,后面那个是底部 if (scrollY == 0 || scrollY == offset) { return true; } return false; }// 是否需要开启动画 private boolean isNeedAnimation() {return !normal.isEmpty(); }}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.example.ui.MyScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:scrollbars="none"> <!-- 这里可以尽情的布局 --> <LinearLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:paddingLeft="20dp" android:paddingRight="20dp" android:orientation="vertical" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> </LinearLayout> </com.example.ui.MyScrollView> </LinearLayout>
0 0
- 自己的ScrollView实现反弹效果
- ScrollView反弹效果的实现
- ScrollView反弹效果的实现
- ScrollView反弹效果的实现
- ScrollView反弹效果实现
- ScrollView的反弹效果的实现
- Android ScrollView反弹效果的实现
- Android ScrollView反弹效果的实现
- Android ScrollView反弹效果的实现
- Android ScrollView反弹效果的实现
- android ScrollView反弹效果的实现
- Android ScrollView反弹效果的实现
- Android ScrollView反弹效果的实现
- ScrollView的反弹效果
- scrollview实现反弹效果与解决与listview的冲突
- Android自定义ScrollView实现反弹效果
- Android自定义ScrollView实现反弹效果
- ScrollView反弹效果实现[bug修正版]
- 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- 数据库面试(持续更新)
- 如何将Myeclipse项目发布到eclipse上面去
- OCP 1Z0 051 160
- 设计模式之十一:Composite(组合)—对象结构型模式
- 自己的ScrollView实现反弹效果
- junit4的几个assert方法
- 色的一天的优惠疙瘩是一个好玩色诱
- gabor filter 已修改
- Linux Shell基本使用
- 设计模式之十二:Proxy(代理)—对象结构型模式
- centOS 6.4下安装中文输入法
- 《Pro Android Graphics》读书笔记之第六节
- 【mysql】mysql 常用建表语句