阻尼效果即是图片向下拉动时会放大,松开会回弹

1.自定义一个DampView类,继承ScrollView

2.布局最外层必须是DampView,且DampView和要拉动的图片之间只能有一层layout(切记)

3.Activity中调用

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.Scroller; /**
* 阻尼效果的scrollview
*/
public class DampView extends ScrollView {
/** 该属性具体参数 怎么控制 未解!!!!*/
private static final int LEN = 0xc8;
/** 回弹时所用的时间 */
private static final int DURATION = 200;
// private static final int MAX_DY = 200;
/** 最大Y坐标 其值一般设定为Scroller对应控件的高度 */
private static final int MAX_DY = 200;
private Scroller mScroller;
TouchTool tool;
int left, top;
float startX, startY, currentX, currentY;
int imageViewH;
int rootW, rootH;
ImageView imageView;
boolean scrollerType; public DampView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); } public DampView(Context context, AttributeSet attrs) {
super(context, attrs);
mScroller = new Scroller(context);
} public DampView(Context context) {
super(context); } public void setImageView(ImageView imageView) {
this.imageView = imageView;
} float curY;
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
int action = event.getAction();
if (!mScroller.isFinished()) {
return super.onTouchEvent(event);
}
currentX = event.getX();
currentY = event.getY();
imageView.getTop();
switch (action) {
case MotionEvent.ACTION_DOWN:// 变量赋初始值
left = imageView.getLeft();
top = imageView.getBottom();
rootW = getWidth();
rootH = getHeight(); imageViewH = imageView.getHeight();
startX = currentX;
startY = currentY;
tool = new TouchTool(imageView.getLeft(), imageView.getBottom(),
imageView.getLeft(), imageView.getBottom() + LEN);
break;
case MotionEvent.ACTION_MOVE:
if (imageView.isShown() && imageView.getTop() >= 0) {
if (tool != null) {
int t = tool.getScrollY(currentY - startY);
if (t >= top && t <= imageView.getBottom() + LEN) {
android.view.ViewGroup.LayoutParams params = imageView
.getLayoutParams();
params.height = t;// 改变高度
imageView.setLayoutParams(params);
} }
scrollerType = false;
}
break;
case MotionEvent.ACTION_UP:
scrollerType = true; // 松手后 回弹
// 开始一个动画控制,由(startX , startY)在duration时间内前进(dx,dy)个单位
// ,即到达坐标为(startX+dx , startY+dy)处
mScroller.startScroll(imageView.getLeft(), imageView.getBottom(),
0 - imageView.getLeft(),
imageViewH - imageView.getBottom(), DURATION);
invalidate();
break;
} return super.dispatchTouchEvent(event);
} // //该mScroller针对于imageView的变化
// 被父视图调用,用于必要时候对其子视图的值(mScrollX和mScrollY)
// 进行更新。典型的情况如:父视图中某个子视图使用一个Scroller对象来实现滚动操作,会使得此方法被调用。
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
int x = mScroller.getCurrX();
int y = mScroller.getCurrY();// ImageView的当前Y坐标
imageView.layout(0, 0, x + imageView.getWidth(), y);//使imageView本身做相应变化
invalidate(); // 滑动还未完成时,手指抬起时,当前y坐标大于其实imageView的高度时
//设定imageView的布局参数 作用:使除imageView之外的控件做相应变化
if (!mScroller.isFinished() && scrollerType && y > MAX_DY) {
android.view.ViewGroup.LayoutParams params = imageView
.getLayoutParams();
params.height = y;
imageView.setLayoutParams(params);
}
// invalidate();
}
} public class TouchTool { private int startX, startY; public TouchTool(int startX, int startY, int endX, int endY) {
super();
this.startX = startX;
this.startY = startY;
} public int getScrollX(float dx) {
int xx = (int) (startX + dx / 2.5F);
return xx;
} public int getScrollY(float dy) {
int yy = (int) (startY + dy / 2.5F);//手势滑动距离/2.5 才是屏幕滑动的距离 此内部类主要做此用
return yy;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<de.hdodenhof.damp.DampView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dampview"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <!--此处必须设置imageview的scaleType为centerCrop,当然在代码中设置也可以-->
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@drawable/bg_geren" /> </LinearLayout> </de.hdodenhof.damp.DampView>
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView; public class MainActivity extends AppCompatActivity { private ImageView img; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupView();
} public void setupView() {
img = (ImageView) findViewById(R.id.img);
DampView view = (DampView) findViewById(R.id.dampview);
view.setImageView(img);
}
}

DampView阻尼效果的更多相关文章

  1. Android -------- BouncingJellyView 果冻视图(阻尼效果)

    分享一个不错的效果,分享给大家 BouncingJellyView 果冻视图,就像果冻一样伸缩弹跳,也叫阻尼效果.这个效果在MIUI上面到处都可以看到. 效果图: 使用 项目更目录bulid.grad ...

  2. android 自定义ScrollView实现背景图片伸缩(阻尼效果)

    android 自定义ScrollView实现强调内容背景图片伸缩(仿多米,qq空间背景的刷新) 看到一篇文章,自己更改了一下bug: 原文地址:http://www.aiuxian.com/arti ...

  3. 自定义view实现阻尼效果的加载动画

    效果: > 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减 ...

  4. Android安卓下拉阻尼效果实现原理及简单实例

    原理  这种效果是通过自定义控件的方式来实现的,我自定义了一个控件类型,这个自定义控件(PullDownDumperLayout)继承自线性布局(LinearLayout).  用户可以下拉弹出的那个 ...

  5. ScrollView阻尼效果

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  6. ListView阻尼效果

    效果图省略.. . activity_main.xml(仅仅有一个自己定义ListView) <RelativeLayout xmlns:android="http://schemas ...

  7. Unity实现滑页效果(UGUI)

    简介 项目需要...直接展示效果吧: 原理 使用UGUI提供的ScrollRect和ScrollBar组件实现基本滑动以及自己控制每次移动一页来达到滑页的效果. 实现过程 1.创建两个panel,上面 ...

  8. 转--2014年最新810多套android源码2.46GB免费一次性打包下载

    转载自:http://www.eoeandroid.com/thread-497046-1-1.html 感谢该博客主人无私奉献~~ 下面的源码是从今年3月份开始不断整理源码区和其他网站上的安卓例子源 ...

  9. 史上比较用心的纯代码实现 AutoLayout

    入职有两三个月了吧,都是使用 Objective-C 纯代码(虽然有时候偷偷参杂一些 Swift 开源库)来编写公司APP,写布局的时候几乎都是要么在初始化的时候用 initWithFrame,要么就 ...

随机推荐

  1. rsa加密解密

    2016年3月17日 17:21:08 星期四 现在越来越懒了.... 参考: http://www.xuebuyuan.com/1399981.html 左边是加密流程, 右边是解密流程 呃...有 ...

  2. c# 获取系统版本,获取net framework 版本(Environment 类)

    1.获取当前操作系统版本信息 使用Environment.OSVersion 属性 获取包含当前平台标识符和版本号的 OperatingSystem 对象. 命名空间:  System程序集:  ms ...

  3. 新浪微博授权失败:applications over the unaudited use restrictions

    在用新浪微博授权第三方app时,授权失败,log显示 com.sina.weibo.sdk.exception.WeiboHttpException: {,"request":&q ...

  4. VC++ 获取当前模块的路径(dll/exe)

    一般地,获取当前模块路径都是通过调用 GetModuleFileName() 来获取的. DWORD WINAPI GetModuleFileName( __in HMODULE hModule, _ ...

  5. modbus协议讲义

        Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看 ...

  6. unbutu下搭建FTP服务

    安装 apt-get install vsftpd 启动 service vsftpd start 第一次连接的时候出了点问题,报了一个 login incorrect 530的连接错误 然后百度了一 ...

  7. 【XLL API 函数】xlGetBinaryName

    用于返回由 xlDefineBinaryName 函数定义的名称数据句柄.定义的名称和工作簿一起保存,我们可以在任意时间访问这个名称. 原型 Excel12(xlGetBinaryName, LPXL ...

  8. August 12th 2016 Week 33rd Friday

    Everything is good in its season. 万物逢时皆美好. Every dog has its day. You are not in your best condition ...

  9. Shell之变量操作

    1.定义变量:为了避免与环境变量冲突,一般用小写:如pp="mydql,kdkfeof"; 第二赋值方案: 调用变量使用$符号: 变量叠加: 2.输出采用echo,如上图所示: 3 ...

  10. Django搭建简易博客

    Django简易博客,主要实现了以下功能 连接数据库 创建超级用户与后台管理 利用django-admin-bootstrap美化界面 template,view与动态URL 多说评论功能 Markd ...