很多时候我们在开发的过程中,需要做一些特殊的效果,今天就为大家介绍一下如何做一个阻尼的效果,所谓的阻尼效果就是头布局的背景图片在下拉的时候放大,在释放手指的时候缩小,从而产生放大缩小的效果。实现的方案就是继承ListView,并添加头布局,在触摸监听事件里面去实现该效果。下面就开始演示实现效果的效果图,以及代码的实现方式。

PullZoomListView.javapublic class PullZoomListView extends ListView {private LinearLayout mHeadView;//要实现阻尼效果的HeadViewprivate int mHeadViewHeight;//默认状态下要实现阻尼效果的HeadView的高度private LayoutParams mParams;private int mMaxHeight = 200;//自定义下拉增加的最大高度private int mDownY = -1; // 按下的y轴的值, 默认为: -1private int mDiffY = -1;//纪录最终下拉的高度,默认为: -1public PullZoomListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initHeadView();}public PullZoomListView(Context context, AttributeSet attrs) {super(context, attrs);initHeadView();}public PullZoomListView(Context context) {super(context);initHeadView();}//给ListView的HeadView添加要实现阻尼效果的Viewprivate void initHeadView() {mHeadView = (LinearLayout) View.inflate(getContext(), R.layout.head_view, null);mHeadView.measure(0, 0);// 手动测量宽高mHeadViewHeight = mHeadView.getMeasuredHeight();this.addHeaderView(mHeadView);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:if (isDisplayHeaderView()) {mParams = (LayoutParams) mHeadView.getLayoutParams();mDownY = (int) ev.getY();}break;case MotionEvent.ACTION_MOVE:if (isDisplayHeaderView()) {if (mDownY == -1) {mDownY = (int) ev.getY();}int moveY = (int) ev.getY();// 移动的间距int diffY = moveY - mDownY;if (diffY >= mMaxHeight) {diffY = mMaxHeight;}if (diffY > 0) {mDiffY = diffY;mParams.height = mHeadViewHeight + mDiffY;mHeadView.setLayoutParams(mParams);}}break;case MotionEvent.ACTION_UP:if (mDiffY > 0 && isDisplayHeaderView()) {reset();}break;default:break;}return super.onTouchEvent(ev);}//释放手指后实现回弹效果private void reset() {mDiffY = -1;ValueAnimator animator;// 动画器animator = ValueAnimator.ofInt(mHeadViewHeight + mDiffY, mHeadViewHeight);// 动画更新的监听animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator arg0) {Integer height = (Integer) arg0.getAnimatedValue();// 获取动画当前变化的值// 根据最新高度,更新布局高度mParams.height = height;mHeadView.setLayoutParams(mParams);}});animator.setDuration(50);// 动画时间animator.start();// 开启动画}public View getView() {return mHeadView;}/*** 判断HeadView是否完全显示了.** @return true, 完全显示, false 没有显示*/private boolean isDisplayHeaderView() {int[] location = new int[2]; // 0位存储的是x轴的值, 1是y轴的值// 获取HeadView屏幕中y轴的值mHeadView.getLocationOnScreen(location);int mSecondHeaderViewYOnScreen = location[1];return mSecondHeaderViewYOnScreen > 0 ? true : false;}}
head_view.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent">
<RelativeLayout
    android:layout_width="match_parent"android:layout_height="match_parent"><ImageView
        android:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop"android:src="@mipmap/service_weather_pic_background" />
</RelativeLayout>
</LinearLayout>
MainActivity.javapublic class MainActivity extends Activity {private PullZoomListView mListView;private Context mContext;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext=this;initView();}//初始化Viewprivate void initView(){mListView=(PullZoomListView)findViewById(R.id.listView);mListView.setAdapter(new Adapter());}private class Adapter extends BaseAdapter {@Overridepublic int getCount() {return 80;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView textView = new TextView(mContext);textView.setPadding(50, 50, 50, 50);textView.setText(position + 10 + "");return textView;}}
}
activity_main.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"><it.my.demo.view.PullZoomListView
        android:layout_height="match_parent"android:layout_width="match_parent"android:id="@+id/listView"></it.my.demo.view.PullZoomListView>
</LinearLayout>

附:源码下载地址

android的阻尼效果相关推荐

  1. android 阻尼动画,Android拉伸阻尼效果实现

    最主要就这个类: package com.bluemagee.assistant.app; import android.content.Context; import android.graphic ...

  2. Android项目必备技术

    1.一个APP只需要一个Activity //片段fragmentimplementation 'me.yokeyword:fragmentation:1.3.6'implementation 'me ...

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

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

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

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

  5. android 阻尼效果

    public class CustomScroller extends ScrollView {private View childView;// 子View(ScrollerView的唯一子类)pr ...

  6. Android仿ios二级菜单侧滑,仿IOS的列表项滑动菜单——ListItemMenu

    一个简单的仿IOS的列表项滑动菜单(也不知道怎么描述比较好). 顺手做出来的小东西,就分享给大家了. 仿iOS列表项滑动菜单: 1.滑动出现菜单,越界阻尼效果: 2.删除列表项效果. GitHub地址 ...

  7. android自带下拉阻尼动画,android 有阻尼下拉刷新列表的实现方法

    本文将会介绍有阻尼下拉刷新列表的实现,先来看看效果预览: 这是下拉状态: 这是下拉松开手指后listView回滚到刷新状态时的样子: 1. 如何调用 虽然效果图看起来样子不太好看,主要是因为那个蓝色的 ...

  8. android歌词效果,自定义View:Android歌词控件

    TicktockMusic 音乐播放器项目相关文章汇总: 简介 之前做 TicktockMusic 音乐播放器,一个必要的需求肯定是歌词,在 github 上找了几个,发现或多或少都有点不满足需求,所 ...

  9. Android ScrollView用法实例汇总

    ScrollView作为一个支持可以垂直滑动的容器控件,如果不对它进行拓展,而是简单使用的话那确实比较简单.但是,它虽然简单,拓展性能却很强.比如可以实现阻尼效果,可以监听滑动情况,可以解决滑动冲突问 ...

最新文章

  1. 口腔跨考计算机,不是所有的医学专业都接受跨考,你了解多少?
  2. tcpdump 识别成dns_1.6.3 使用tcpdump观察DNS通信过程
  3. fiddler怎么修改服务器返回数据,基于Fiddler实现修改接口返回数据进行测试
  4. 程序员如何保持身心健康,做到这几点,远离秃头。
  5. python如何给一组数据打标签_给数据集打标签python代码实现(1)
  6. mysql定义变量字符串类型_mysqli_stmt :: bind_param():类型定义字符串中的元素数量与绑定变量的数量不匹配...
  7. php 顺序排序,PHP顺序排序
  8. Ant Design暗黑模式设计解析
  9. IIS服务器重启三种方法
  10. windTerm—Xshell、SercureCRT等替代品
  11. 怎么一台手机多人签到_人脸识别来啦!志愿汇APP最新改版!支持一个手机多个账号同时签到签退!...
  12. PS——ps打开webp格式的图片
  13. win7家庭版升级win7旗舰版
  14. 今天是没有python的一天(大物实验‘利用牛顿环测量曲率半径’报告和大物复习)
  15. 【读书笔记】第二章 过程模型
  16. flash在C#中的应用
  17. 压缩包文件如何设置加密、删除加密?
  18. agv系统介绍_AGV智能小车控制系统介绍
  19. IDEA使用技巧 - 修改项目名称和模块名称
  20. 8-四平方和定理(拉格朗日定理)

热门文章

  1. Xavier红外相机(IP摄像头)开发记录
  2. Java网络编程学习——简单模拟在线聊天
  3. 浏览器 看不到请求了
  4. 企业为什么要选择软文营销?
  5. kubernetes(k8s) 安装 Prometheus + Grafana
  6. 【DRV8323】电机驱动芯片寄存器配置指南,通过STM32F407的SPI通信配置
  7. 【JAVA】java性能分析之线程DUMP分析
  8. 51nod1009 数字1的数量
  9. Linux下音频格式转换命令行工具
  10. Android 换肤解决方案