Android ScrollView实现反弹效果的实例

Android ScrollView实现反弹效果

自定义ScrollView控件:

/**
 * ScrollView反弹效果的实现
 */
public class BounceScrollView extends ScrollView {
  private View inner;// 孩子View 

  private float y;// 点击时y坐标 

  private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.) 

  private boolean isCount = false;// 是否开始计算 

  public BounceScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  } 

  /***
   * 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate
   * 方法,也应该调用父类的方法,使该方法得以执行.
   */
  @Override
  protected void onFinishInflate() {
    if (getChildCount() > 0) {
      inner = getChildAt(0);
    }
  } 

  /***
   * 监听touch
   */
  @Override
  public 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;
  } 

}

实现反弹效果:

<com.techrare.view.BounceScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/tab_chart_bg"
    android:scrollbars="none" > 

    <LinearLayout
      android:layout_width="fill_parent"
      android:layout_height="match_parent"
      android:gravity="center_horizontal"
      android:orientation="vertical"
      android:paddingLeft="20dp"
      android:paddingRight="20dp" >
<span style="white-space:pre">   </span><!-- 这里可以尽情的布局 -->
    </LinearLayout>
</com.techrare.view.BounceScrollView>

以上就是 Android ScrollView实现反弹效果的实例的讲解,本站关于Android开发的文章还有很多,欢迎大家搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • android scrollview 滑动到顶端或者指定位置的实现方法

    在Android开发中很多时候会遇到一屏显示不下所有内容的现象,那大家也知道这个时候肯定会想到用scrollview来进行滚屏显示. 这个时候由于某些需求,会要求在最开始显示scrollview的时候就定位到某一处,这篇就是来讲这个的哈- 首先,scrollView.scrollTo( x, y );这个方法是能对滚动条进行定位的,这个大家都知道. But,貌似很多时候这个方法的调用没有什么效果呀-- 上面所说的调用scrollTo方法看上去好像并没有起到对滚动条进行定位的效果,其实是因为我们是

  • android scrollview 自动滚动到顶部或者底部的实例

    android scrollview 自动滚动到顶部或者底部 摘要: android scrollview 自动滚动到顶部或者底部 android scrollview 自动滚动到顶部或者底部 //设置默认滚动到顶部 scrollView.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub scrollView.fullScroll(ScrollView.FOCUS_UP);

  • Android中使用ScrollView指定view的顶部悬停效果

    因项目中的需要实现ScrollView顶部的悬停,也不是太难便自己实现功能,话不多说,先上效果图 红色text一到顶上便会悬浮在上面,不会跟随scrollview的滑动而上滑. 原理: 原理其实很简单就是对view的gone和visible,写两个相同的要置顶的view,一个设置为gone,一个为visible,当可见的view超出屏幕范围的时候,将不可以的view设置为visible,不可见的view 与scrollview要同级,这样滑动的时候不会影响到view的位置. 直接上代码 <?xm

  • Android中ScrollView嵌套GridView显示不全解决方法

    Android中ScrollView嵌套GridView显示不全解决方法 由于ScrollView和GridView这两款控件都自带滚动条,一起使用GridView会显示不全 解决方法:自定义gridview 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • Android自定义ScrollView实现放大回弹效果

    背景 在很多项目中我们都会用到ScrollView这个控件,因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容.但是ScrollView滑动时效果感觉太死板了,这个时候我们如果给它添加一个回弹的动画效果,会让界面交互更加舒服,提升用户体验效果. 自定义ScrollView 1.创建一个类,继承ScrollView并重写相应的构造函数 public class ZoomInScrollView extends ScrollView { public ZoomInScrollView

  • Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法

    Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法 ScrollView 下嵌套 ListView 或 GridView 会发列表现数据只能显示一行.因为他们都是滚动结构,两个滚动条放到一起就会引起冲突. 解决此问题可以通过计算 ListView 高度或重写 ListView 的 onMeasure 方法来解决.下面介绍通过重写 onMeasure 方法来解决问题. 重写 onMeasure 方法如下: public class ScrollLi

  • Android ScrollView取消惯性滚动的方法

    ScrollView中惯性滚动的效果,想让这个ScrollView慢一点滑动或者接近drag(拖拽)操作,就提出了添加阻尼的说法.只要重新fling方法即可,将velocity值极至缩小. 实例如下: public class CustomHorizontalScrollView extends HorizontalScrollView { private Context context; private ScrollViewListenner listenner; private Custom

  • Android ScrollView无法填充满屏幕的解决办法

    Android ScrollView无法填充满屏幕的解决办法 ScrollView滚动视图是指当拥有很多内容.屏幕显示不完时.需要通过滚动跳来显示的视图.Scrollview的一般用法如下 以下代码在Scrollview里面放了一个RelativeLayout.并且是设置为Android:layout_height="match_parent"填充全屏的和RelativeLayout里面放置了一个TextView背景设为了一张图片.按照代码理解.图片应该是居于屏幕的最下方的 <S

  • Android ScrollView实现反弹效果的实例

    Android ScrollView实现反弹效果 自定义ScrollView控件: /** * ScrollView反弹效果的实现 */ public class BounceScrollView extends ScrollView { private View inner;// 孩子View private float y;// 点击时y坐标 private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.) private boole

  • Canvas放置反弹效果随机图形(实例)

    Canvas放置反弹效果随机图形(实例) var raf; var arror = []; var running = false; //绘制圆形 function createBall() { return { x: 0, y: 0, vx: 10-Math.random()*10, vy: 10-Math.random()*10, radius: 25, color:"red", draw: function() { ctx.beginPath(); ctx.arc(this.x,

  • android 自定义圆角button效果的实例代码(自定义view Demo)

    概述 在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等. 针对这样的场景,直接使用创建多个shape,定义多个xml文件也是可以实现的.但是如果使用非常频繁,那么直接自定义一个就会来的非常方便. 甚至在一些情况下,不是可以用shape定义的规则图形,比如需要用到贝塞尔曲线等. 如果全局需要这样风格的view,那么自定义一个View是非常必要的. 本文主要是个demo记录,如有需要的读者可以借鉴学习. Demo 主要

  • android GridView多选效果的实例代码

    具体代码如下: main.xml 复制代码 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:background="#000000" android:layout_width="fill_parent"

  • Android开发实现带有反弹效果仿IOS反弹scrollview教程详解

    首先给大家看一下我们今天这个最终实现的效果图: 这个是ios中的反弹效果.当然我们安卓中如果想要实现这种效果,感觉不会那么生硬,滚动到底部或者顶部的时候.当然 使用scrollview是无法实现的.所以我们需要新建一个view继承ScrollView package davidbouncescrollview.qq986945193.com.davidbouncescrollview; import android.annotation.SuppressLint; import android.

  • Android实现下拉放大图片松手自动反弹效果

    本文实例为大家分享了Android实现下拉放大图片松手自动反弹的具体代码,供大家参考,具体内容如下 直接看效果: 下面就是代码 HeadZoomScrollView类 import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; i

  • Android仿微信朋友圈实现滚动条下拉反弹效果

    微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动条实现的.下拉,当松开时候,反弹至原来的位置.下拉时候能看到背景图片.那么这里简单介绍一下这种效果的实现. 1.效果图 这部手机显示的分辨率有限,很老的手机调试. 2.具有反弹效果BounceScrollView package com.org.scroll; import android.content.Context; import android.graphics.Rect; import androi

  • Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还是蛮实用的. 思路:其实原理很简单,实现一个自定义的Scrollview方法(来自网上大神),然后在布局文件中使用自定义方法Scrollview就可以了. 代码: 自定义View,继承自Scrollview.MyReboundScrollView类 package com.wj.myrebounds

  • Android ScrollView实现横向和竖向拖动回弹效果

    本文实例为大家分享了Android ScrollView实现拖动回弹效果的具体代码,供大家参考,具体内容如下 原理 在android2.3版本中,View类中新增了一个方法:overScrollBy.通过覆盖该方法,就可以达到阻尼回弹的效果. 示例1.竖向滚动 public class ReboundScrollView extends ScrollView{ private static final int MAX_SCROLL = 200; private static final floa

  • Android使用ScrollView实现滚动效果

    本文实例为大家分享了ScrollView实现滚动效果的具体代码,供大家参考,具体内容如下 如果长文本的内容超过一屏幕 则只能显示一屏幕的内容 设置ScrollView 通过滚动浏览下面的内容 若将标签更改为<HorizontalScrollView></HorizontalScrollView>则为水平滚动效果 xml文件: <?xml version="1.0" encoding="utf-8"?> <android.su

随机推荐