栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

Android ScrollView实现下拉弹回动画效果

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android ScrollView实现下拉弹回动画效果

这里设计一个自定义View,继承了ScrollView,实现可以下拉里面的内容,松手后画面弹回,这个自定义的View可以当做ScrollView来使用。

一般设计时的应用效果:

一.自定义View的设计代码

package com.lwz.mathbox.weight;

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;


public class SpringScrollView extends ScrollView {

  private View inner;// 孩子

  private float y;// 坐标

  private Rect normal = new Rect();// 矩形空白

  public SpringScrollView(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) {
      commonTouchEvent(ev);
    }
    return super.onTouchEvent(ev);
  }

  
  public 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()) {
   animation();
 }
 break;
      case MotionEvent.ACTION_MOVE:
 final float preY = y;
 float nowY = ev.getY();
 int deltaY = (int) (preY - nowY);// 获取滑动距离

 y = nowY;
 // 当滚动到最上或者最下时就不会再滚动,这时移动布局
 if (isNeedMove()) {
   if (normal.isEmpty()) {
     // 填充矩形,目的:就是告诉this:我现在已经有了,你松开的时候记得要执行回归动画.
     normal.set(inner.getLeft(), inner.getTop(),
  inner.getRight(), inner.getBottom());
   }
   // 移动布局
   inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
inner.getRight(), inner.getBottom() - deltaY / 2);
 }
 break;

      default:
 break;
    }
  }

  
  public void animation() {
    // 开启移动动画
    TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
 normal.top);
    ta.setDuration(300);
    inner.startAnimation(ta);
    // 设置回到正常的布局位置
    inner.layout(normal.left, normal.top, normal.right, normal.bottom);
    normal.setEmpty();// 清空矩形
  }

  
  public boolean isNeedAnimation() {
    return !normal.isEmpty();
  }

  
  public boolean isNeedMove() {
    int offset = inner.getMeasuredHeight() - getHeight();
    int scrollY = getScrollY();
    // 0是顶部,后面那个是底部
    if (scrollY == 0 || scrollY == offset) {
      return true;
    }
    return false;
  }

}

二.简单调用示例




  //包名+类型
  

    

      

      

      
  


调用的话只需要在xml中调用就可以了,逻辑操作的实现已经在自定义的View中完成了, 对应这些工具类,没有必要很深入去理解,学会调用就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/158276.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号