android bounceScrollView_第1张图片

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >     <com.baoy.demobouncescrollview.BounceScrollView          android:id="@+id/scrollView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:background="@drawable/bg"        android:fillViewport="true"          >           <TextView             android:id="@+id/textView"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="@string/app_name"        android:textColor="@color/black"             />     </com.baoy.demobouncescrollview.BounceScrollView></RelativeLayout>

package com.baoy.demobouncescrollview;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);}}

package com.baoy.demobouncescrollview;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;/** * ScrollView反弹效果的实现 * com.baoy.demobouncescrollview.BounceScrollView */public class BounceScrollView extends ScrollView {private View inner;// 孩子Viewprivate float y;// 点击时y坐标private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)private boolean isCount = false;// 是否开始计算public BounceScrollView(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) {commOnTouchEvent(ev);}return super.onTouchEvent(ev);}/*** * 触摸事件 *  * @param ev */public void commOnTouchEvent(MotionEvent ev) {int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_UP:// 手指松开.if (isNeedAnimation()) {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("jj", "矩形:" + 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;default:break;}}/*** * 回缩动画 */public 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);//Log.e("jj", "回归:" + normal.left + "," + normal.top + "," + normal.right//+ "," + normal.bottom);normal.setEmpty();}// 是否需要开启动画public boolean isNeedAnimation() {return !normal.isEmpty();}/*** * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度 *  * getHeight():获取的是屏幕的高度 *  * @return */public boolean isNeedMove() {int offset = inner.getMeasuredHeight() - getHeight();int scrollY = getScrollY();//Log.e("jj", "scrolly=" + scrollY);// 0是顶部,后面那个是底部if (scrollY == 0 || scrollY == offset) {return true;}return false;}}

更多相关文章

  1. Android 坐标系统
  2. android 自学笔记2-布局
  3. Android 圆角矩形
  4. 学个明白--Android世界的坐标系
  5. Android RecyclerView多个Item布局的实现(可实现头部底部)
  6. Android计算器界面布局
  7. android 不使用布局文件,完全由代码控制布局实例
  8. android控件相对布局
  9. Android 动态布局

随机推荐

  1. live555移植到Android过程.
  2. android studio 开发 Execution failed f
  3. Android应用开发提高系列(5)——Android动
  4. Android(安卓)中级教程之------Android(
  5. Android程序员学IOS-UI篇
  6. [转]android Android(安卓)SDK Setup的使
  7. 《Android/OPhone 开发完全讲义》已出版,
  8. Android(安卓)内核源代码交叉编译(创建自
  9. Android学习日记(一)
  10. Android(安卓)给ImageView自定义设置边框