Android 自定义ScrollView(具有反弹效果的ScrollView,能够兼容横向的滑动)
package com.itau.jingdong.widgets; 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; /**
@description 具有反弹效果的ScrollView,能够兼容横向的滑动
*/
public class AbScrollView extends ScrollView {
private View inner; // 孩子View
private static final int DEFAULT_POSITION = -;
private float y = DEFAULT_POSITION;// 点击时y的坐标
private Rect normal = new Rect(); // 滑动距离及坐标
private float xDistance, yDistance, xLast, yLast; public AbScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
} /**
* 根据XML生成视图工作完成,该函数在生成视图的最后调用,在所有子视图添加完成之后, 即使子类覆盖了onFinishInflate
* 方法,也应该调用父类的方法, 使得该方法得以执行
*/
@Override
protected void onFinishInflate() {
if (getChildCount() > ) {
inner = getChildAt(); }
} @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:
y = ev.getY();
break;
case MotionEvent.ACTION_UP: if (isNeedAnimation()) {
animation();
} y = DEFAULT_POSITION;
break; /**
* 排除第一次移动计算,因为第一次无法得知y左边,在MotionEvent.ACTION_DOWN中获取不到,
* 因为此时是MyScrollView的Tocuh时间传递到了ListView的孩子item上面。所以从第二次开始计算
* 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归零,之后记录准确了就正常执行
*/
case MotionEvent.ACTION_MOVE:
float preY = y;
float nowY = ev.getY();
if (isDefaultPosition(y)) {
preY = nowY;
}
int deltaY = (int) (preY - nowY);
scrollBy(, deltaY);
y = nowY;
// 当滚动到最上或者最下时就不会再滚动,这时移动布局
if (isNeedMove()) {
if (normal.isEmpty()) {
// 保存正常的布局位置
normal.set(inner.getLeft(), inner.getTop(),
inner.getRight(), inner.getBottom()); }
// 移动布局
inner.layout(inner.getLeft(), inner.getTop() - deltaY,
inner.getRight(), inner.getBottom() - deltaY);
}
break; default:
break;
}
} // 开启动画移动 public void animation() {
// 开启移动动画
TranslateAnimation ta = new TranslateAnimation(, , inner.getTop(),
normal.top);
ta.setDuration();
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();
if (scrollY == || scrollY == offset) {
return true;
}
return false;
} // 检查是否处于默认位置
private boolean isDefaultPosition(float position) {
return position == DEFAULT_POSITION;
} @Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY(); xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY; if (xDistance > yDistance) {
return false;
}
} return super.onInterceptTouchEvent(ev);
} }
Android 自定义ScrollView(具有反弹效果的ScrollView,能够兼容横向的滑动)的更多相关文章
- 【Android】Android开发实现带有反弹效果,仿IOS反弹scrollview详解教程
作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...
- Android -- 仿ios上下反弹效果
1,前几天在一个app上看到了滑动反弹效果,觉得这个效果挺不错的,然后想自己来实现一下,在网上查了一下基本上都是大致的说了下思路,自己看了一下,决定把实现的思路来详细的写下来,先看一下我们实现的效果吧 ...
- Android 自定义View跑马灯效果(一)
今天通过书籍重新复习了一遍自定义VIew,为了加强自己的学习,我把它写在博客里面,有兴趣的可以看一下,相互学习共同进步: 通过自定义一个跑马灯效果,来诠释一下简单的效果: 一.创建一个类继承View, ...
- Android:自定义滚动边缘(EdgeEffect)效果
Android可滚动控件(GridView.ListView.ScrollView等)当用户滚动到头的时候会有个边缘反馈效果,在4.0上默认为Holo蓝色效果. 如果您的App自定义了主题颜色,比如 ...
- 天气渐热,来片雪花降降温——Android自定义SurfaceView实现雪花效果
实现雪花的效果其实也可以通过自定义View的方式来实现的(SurfaceView也是继承自View的),而且操作上也相对简单一些,当然也有一些不足啦... 相对于View,SurfaceView有如下 ...
- android 自定义view之侧滑效果
效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.Vi ...
- android自定义view实现公章效果
上次去一个公司面试,面试官问了一个题,怎么用android的自定义view实现一个公章的效果,据说这是华为之前的面试题,我想了下,要是公章的效果,最外层是一个圆,里面是一个五角星,但是这文字怎么画呢, ...
- Android -- 自定义ViewGroup实现FlowLayout效果
1,在开发的时候,常在我们的需求中会有这种效果,添加一个商品的一些热门标签,效果图如下: 2,从上面效果可以看得出来,这是一个自定义的ViewGroup,然后实现换行效果,让我们一起来实现一下 自定义 ...
- ScrollView反弹效果 仿小米私密短信效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/28441197 如今非常多APP都给ScrollView加入了反弹效果.QQ.小米 ...
随机推荐
- getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor
症状: SpringMVC+MyBatis向数据库插入数据,主键应用ORACLE中自己设置的自增序列会发生如下错误: nested exception is Java.sql.SQLException ...
- 2019 CCPC-Wannafly Winter Camp Day5(Div2, onsite)
solve 5/11 补题:7/11 A Cactus Draw Code:zz Thinking :zz 题意:要在n*n的网格内画上一棵节点数为n树,使得没有边相交. 很好想的构造题,因为网格有n ...
- Salesforce LINKS
Salesforce的二次开发平台的多租户架构 http://blog.talkingdata.net/?p=4807 Salesforce 简介 https://www.cnblogs.com/ch ...
- 12.2.0.1 restart环境执行root.sh 报 CLSRSC-400 错误
问题描述: 在LINUX 7.5 的环境上安装12.2.0.1 Restart Grid环境,执行root.sh 报 CLSRSC-400 错误 错误如下: 解决办法: 1. 参考(文档ID 136 ...
- 基于python实现Oracle数据库连接查询操作
使用python语言连接Oracle数据库配置 #coding:utf-8 import cx_Oracle as oracle db=oracle.connect('root/123456@192. ...
- HBase启动时IP地址解析不正确的问题及解决方法
HBase启动时遇到IP地址解析不正确,连不上Regionserver , 配置文件上写的 192.168.100.28, 错误信息 Problem binding to /202.102.110. ...
- JDK,JRE,JVM的基础理解
1.JVM -- java virtual machine JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类 ...
- mysql Access denied for user root@localhost错误解决方法总结
原文:http://www.111cn.net/database/mysql/44142.htm Access denied for user 'root'@'localhost' (using pa ...
- Request笔记
1 Request 的简介和运行环境 1.HttpServletRequest 概述 我们在创建 Servlet 时会覆盖 service()方法,或 doGet()/doPost(),这些方法都有两 ...
- 使用spring遇到问题 事物不提交和更新失败
1 使用学习使用spring mvc进行前端代码编写,发现提交修改没发sql语句 测试dao层又没问题 解决: 原来是spring配置文件,事物管理 绑定到了dao层.测试界面前端应该绑定到servi ...