OS的下拉上拉都会出现一个很玄的动态效果。在Android中,虽然可以实现类似的效果,但有点不同的是,如果调用overScrollBy来实现类似的阻尼效应的话,最顶部会出现一片亮的区域,让人感觉不是很爽。所以决定不采用该方法来实现而是改用自定义的方式来实现。

下面是自定义控件的代码部分:

public class MyView extends ScrollView {

//记录下最开始点击的位置

int initY;

//移动的位置

int deltaY;

int touchY;

//记录第一个item的位置的矩形

Rect topRect;

//用来存放第一个可见的item

View inner;

//记录下ImageView最原始的顶部位置和底部位置

int initTop,initButtom;

int left = 0,top = 0,right = 0,bottom = 0;

ImageView imageView;

State state;

boolean recordFlag;

enum State

{

UP,NORMAL,DOWN

}

boolean isMoving;

boolean shutScroll;

private int current_Bottom;

private int current_Top;

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

state = State.NORMAL;

topRect=new Rect();

recordFlag=false;

}

public void setImageView(ImageView imageView)

{

this.imageView=imageView;

}

//当布局加载完成之后调用该方法

@Override

protected void onFinishInflate() {

super.onFinishInflate();

//返回加载完成后所看到的第一个item,这里就是看到的第一个item,通过对该对象的移动来实现整体的移动

inner=getChildAt(0);

Log.i("inner", inner.toString());

}

//onTouchEvent的返回值 返回true的话表示该事件已经被处理了,返回false表示改时间还未被处理

@Override

public boolean onTouchEvent(MotionEvent ev) {

if(inner!=null)

{

commOnTouchEvent(ev);

}

if(shutScroll)

{

return true;

}else

{

return super.onTouchEvent(ev);

}

}

private void commOnTouchEvent(MotionEvent ev) {

switch(ev.getAction())

{

case MotionEvent.ACTION_DOWN:

{

if(recordFlag==false)

{

left=inner.getLeft();

top=inner.getTop();

right=inner.getRight();

bottom=inner.getBottom();

recordFlag=true;

}

//开始的时候接触点的坐标值

initY=(int) ev.getY();

//记录下ImageView的原始高度

initTop=imageView.getTop();

//记录下ImageView的原始的底部的像素坐标

initButtom=imageView.getBottom();

break;

}

case MotionEvent.ACTION_MOVE:

{

//滑动的距离

deltaY=(int) (ev.getY()-initY);

if(deltaY<0)

{

//向上滑动

state=State.UP;

isMoving=false;

shutScroll=false;

}

else if(deltaY>=0)

{

//在这里做一下判断,当getScrollY为0时,继续下拉就会进入down状态。

if(getScrollY()==0)

{

//向下滑动

state=State.DOWN;

isMoving=true;

shutScroll=true;

}

}

if(isMoving)

{

if (topRect.isEmpty()) {

// 保存正常的布局位置

topRect.set(left, top,right,bottom);

}

float inner_move_H = deltaY / 5;

inner.layout(topRect.left, (int) (topRect.top + inner_move_H),

topRect.right, (int) (topRect.bottom + inner_move_H));

float image_move_H = deltaY / 10;

current_Top = (int) (initTop + image_move_H);

current_Bottom = (int) (initButtom + image_move_H);

imageView.layout(imageView.getLeft(), current_Top,

imageView.getRight(), current_Bottom);

}

break;

}

case MotionEvent.ACTION_UP:

{

if(needToScroll())

{

animation();

}

if(getScrollY()==0)

{

/*这里为什么要这么写呢?这里有很重要的一个知识点:

* getScrollY()返回的是手机屏幕左上角和调用该方法的view的左上角之间的Y坐标只差。

* 在这里,自定义空间的布局方式看看布局文件就会发现,当View滑动的时候,View的状态在up,normal;

* down之间切换。在View下来的过程中,normal和down有一个临界值,这个临界值就是该view的

* 左上角是不是和屏幕的左上角相等。相等的话就说明再向下拉的话就down状态了。*/

state=State.NORMAL;

}

break;

}

}

}

private void animation() {

//背景图片平移的动画

TranslateAnimation image_Anim = new TranslateAnimation(0, 0,

Math.abs(initTop - current_Top), 0);

image_Anim.setDuration(200);

imageView.startAnimation(image_Anim);

imageView.layout(imageView.getLeft(), (int) initTop,

imageView.getRight(), (int) initButtom);

// 开启移动动画

TranslateAnimation inner_Anim = new TranslateAnimation(0, 0,

inner.getTop(), topRect.top);

inner_Anim.setDuration(200);

inner.startAnimation(inner_Anim);

inner.layout(topRect.left, topRect.top, topRect.right, topRect.bottom);

//state=State.NORMAL;

topRect.setEmpty();

}

private boolean needToScroll() {

if(state==State.DOWN)

{

return true;

}

return false;

}

}

以上这篇Android实现简单的下拉阻尼效应示例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

android自带下拉阻尼动画,Android实现简单的下拉阻尼效应示例代码相关推荐

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

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

  2. android 文字fly动画,超好看的下拉刷新动画Android代码实现

    最近看到了好多高端.大气.上档次的动画效果,如果给你的项目中加上这些动画,相信你的app一定很优秀,今天给大家分析一下来自Yalantis的一个超好看的下拉刷新动画. 首先我们看一下效果如何: 怎么样 ...

  3. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  4. Android修改kernel logo和开机动画(android)

    一.uboot 开机logo 1.安装图片工具 # sudo apt-get install netpbm2.生成logo脚本 //make-uboot-logo.sh #!/bin/sh #1.ub ...

  5. android自带的nsd发现服务器,Android NSD(网络服务发现)是否与iOS中的Bonjour服务兼容?...

    I will create a server-less local networking App for iOS and Android. the App in both iOS and Androi ...

  6. android自带的nsd发现服务器,Android网络服务发现(NSD)协议的使用

    Android的网络服务发现协议(NSD)可以用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会非常有帮助. Android的NSD的使用方法大致上分为四种操作: 1 ...

  7. android 圆形相机预览拍照_Android多种方式实现相机圆形预览的示例代码

    效果图如下: 一.为预览控件设置圆角 public RoundTextureView(Context context, AttributeSet attrs) { super(context, att ...

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

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

  9. android+3.0新加的动画,Android动画片

    使用Android两年多了,工作中的动画也动能应付,自认为Android中的动画自己也能用个八九不离十,结果我在学习[Periscope点赞效果](http://www.jianshu.com/p/0 ...

最新文章

  1. Codeforces Round #676 (Div. 2) E待补
  2. 【2019牛客暑期多校训练营(第三场)- F】Planting Trees(单调队列,尺取)
  3. leetcode876 链表中间的结点
  4. html的课设作业6,第七节课html标签元素属性作业-2019-9-6 作业
  5. caioj 1081 动态规划入门(非常规DP5:观光游览)
  6. iTunes怎么下载
  7. 寒冬中的一次优雅起舞
  8. 电脑显卡,台式电脑显卡怎么选择
  9. mac上投屏android_有哪些支持安卓投屏Mac的软件
  10. java exchange 日历_如何通过EWS-API 获取所有会议室的日历信息
  11. 架构——20——Jenkins+Gitlab实现持续集成——3
  12. 乐固加固后windows下实现给apk签名
  13. 隐藏通信隧道技术(下)
  14. 根据 commit message 自动生成 changelog
  15. 安装升级Exchange Server 2010 SP1补丁
  16. Java缓存资料收集
  17. 银行核心系统:“交易(Transaction)”是什么?
  18. 一种中文作文自动评分方法及教辅系统的复现及步骤摘录
  19. 腾讯云服务器安装配置rabbitmq
  20. 【计网课设】---网络工程方向---医院局域网规划方案

热门文章

  1. 数据库之数据库和表的创建
  2. 支持html邮件,HTML邮件兼容问题与解决方案
  3. 985大学计算机考研难度排名2015,你可能不知道计算机考研985院校也分三六九等...
  4. LINUX杂谈与系统编程
  5. 计算机应用基础二作业,计算机应用基础(二)作业2 (精选可编辑)
  6. 关于绝地求生游戏白名单画中画逆向分析
  7. Go Mod引用私有库
  8. 微信支付接口调用之二维码失效时间的设置
  9. 【医学影像】几个医学影像专业一定要知道的网站
  10. 「RISC-V Arch」RISC-V 规范结构