android 仿QQ空间listview反弹效果

android 自定义控件实现3D画廊效果 阅读详情

思路:主要是listview有个OverScrollBy()方法,它是listview滑动到头部时候还能滑动,先获取imageview的最初高度,然后再滑动的过程中动态去计算imageview的高度,直到imageview显示图片的原始高度

package com.example.adminis.lsitview;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.ImageView;

import com.custom.widget.CustomListView;
import com.example.adminis.lsitview.adapter.MyAdapter;

import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
    private CustomListView custom_listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        custom_listview = (CustomListView) findViewById(R.id.custom_listview);
        final View heaerView = LayoutInflater.from(this).inflate(R.layout.header_lv,null);
        final ImageView iv_header_view = (ImageView) heaerView.findViewById(R.id.iv_header_view);
        custom_listview.addHeaderView(heaerView);

        MyAdapter adapter = new MyAdapter(initData(),this);
        custom_listview.setAdapter(adapter);

        heaerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onGlobalLayout() {
                custom_listview.setView(iv_header_view);
                heaerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
    }

    private List<String> initData() {
        List<String> datas = new ArrayList<String>();
        for(int i=0;i<20;i++){
            datas.add("求你拉我吧,我要反弹---");
        }
        return datas;
    }
}

自定义listviewCustomListView

package com.custom.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HeaderViewListAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;

import com.com.custom.animation.ResetHeightAnimation;

/**
 * Created by Adminis on 2016/1/29.
 */
public class CustomListView extends ListView {

    private static final String TAG = "CustomListView";
    private ImageView iv_header_view;
    private int maxImgHeight;//图片的最大高度
    private int originalHeight;//imageview 图片对应的原始高度

    public CustomListView(Context context) {
        super(context);
    }

    public CustomListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    /**
     * 当listview滑动到头的时候被调用
     * Add a fixed view to appear at the top of the list. If addHeaderView is
     * called more than once, the views will appear in the order they were
     * added. Views added using this call can take focus if they want.
     * <p>
     * Note: When first introduced, this method could only be called before
     * setting the adapter with {@link #setAdapter(ListAdapter)}. Starting with
     * {@link android.os.Build.VERSION_CODES#KITKAT}, this method may be
     * called at any time. If the ListView's adapter does not extend
     * {@link HeaderViewListAdapter}, it will be wrapped with a supporting
    * @param deltaX Change in X in pixels
    * @param deltaY Change in Y in pixels
    * @param scrollX Current X scroll value in pixels before applying deltaX
    * @param scrollY Current Y scroll value in pixels before applying deltaY
    * @param scrollRangeX Maximum content scroll range along the X axis
    * @param scrollRangeY Maximum content scroll range along the Y axis
    * @param maxOverScrollX Number of pixels to overscroll by in either direction
    *          along the X axis.
            * @param maxOverScrollY Number of pixels to overscroll by in either direction
    *          along the Y axis. 滑动到头部最多还可以滑动多少
            * @param isTouchEvent true if this scroll operation is the result of a touch event.
    * @return true if scrolling was clamped to an over-scroll boundary along either
    *          axis, false otherwise. isTouch true就是手慢慢的滑动到头部 false表示一瞬间滑动到头部有惯性的

     */
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
        if(deltaY<0&&isTouchEvent){
            //当前的高度+拖动的距离  动态改变imageview的高度
            int resetHeight = iv_header_view.getHeight()-deltaY;
            if(resetHeight>maxImgHeight){
                resetHeight = maxImgHeight;
            }
            iv_header_view.getLayoutParams().height = resetHeight;
            iv_header_view.requestLayout();//重新 layout --->onLayout去动态计算他的高度
        }
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);

    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_UP:
                ResetHeightAnimation resetHeightAnimation  = new ResetHeightAnimation(iv_header_view,originalHeight);
                startAnimation(resetHeightAnimation);
                break;
        }
        return super.onTouchEvent(ev);
    }

    public void setView(ImageView view) {
        this.iv_header_view = view;
        this.originalHeight = view.getHeight();
        maxImgHeight = iv_header_view.getDrawable().getIntrinsicHeight();
    }
}

ResetHeightAnimation是一个模拟动画在一定时间改变属性

package com.com.custom.animation;

import android.view.View;
import android.view.animation.Animation;
import android.view.animation.OvershootInterpolator;
import android.view.animation.Transformation;

/**
 * Created by Adminis on 2016/1/29.
 */
public class ResetHeightAnimation extends Animation {
    private View view;
    private int targetHeight;
    private int originalHeight;//imageview最初的高度
    private int totalHeight;
    public ResetHeightAnimation(View view,int targetHeight) {
        this.view = view;
        this.targetHeight = targetHeight;
        originalHeight = view.getHeight();
        totalHeight = targetHeight-originalHeight;
        setDuration(400);
        setInterpolator(new OvershootInterpolator());
    }

    /**
     *
     * @param interpolatedTime 动画执行的进度 默认是0--1 或者百分比 比如他是0.5表示动画执行了50%
     * @param t
     */
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        int resetHeight = (int) (originalHeight+totalHeight*interpolatedTime);
        view.getLayoutParams().height = resetHeight;
        view.requestLayout();
    }
}

图:


xml文件就不必贴了,到此为止 该休息了

仿QQ好友列表ListView 仿QQ好友列表ListView,按每个组进行分类,下拉有动画效果! 立即下载

相关推荐

android之仿QQ个人主页的下拉回弹效果

超级简单的,android之仿QQ个人主页的下拉回弹效果

Android RecyclerView增加头部Header和尾部Footer,并实现Item分组

Android RecyclerView增加头部Header和尾部Footer,并实现Item分组如图所示:在Android的RecyclerView上实现增加若干头部Header和若干尾部Footer,关键是利用ViewType的类型,然后由本例的抽象类Item返回的类型加载不同的ViewHolder。代码:package app.zhangphil.exp; import android.g

Zhang Phil 4222

STM32duino LSM6DSO驱动库:低功耗IMU工程化实践

惯性测量单元(IMU)是智能终端与工业设备实现运动感知的核心传感器,其性能关键在于数据精度、实时响应与系统功耗的协同优化。LSM6DSO作为集成加速度计与陀螺仪的六轴MEMS器件,依托片上有限状态机(FSM)和机器学习核心(MLC),支持自由落体检测、计步器、6D方向识别等硬件自治功能,显著降低主控CPU负载。在STM32平台下,通过深度耦合HAL/LL库、显式引脚管理、DMA加速SPI传输及EXTI中断协同,可实现亚毫秒级事件响应与微安级待机功耗。本文聚焦STM32duino生态中LSM6DSO驱动的工程

weixin_36304957的博客 551

Android实现QQ空间沉浸式状态栏,并且滑动ListView实现透明度变化

安卓4.4以后增加了可以改变状态蓝颜色的api,所以现在主流的APP基本上都会把状态栏修改成自己APP的主题颜色。那么接下来就先实现沉浸式状态栏吧,//透明状态栏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明导航栏 getWindow().addFlags(WindowManag

u010723811的专栏 4578

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 685

Outlook日历同步全攻略:Win10+安卓+iOS三端无缝衔接(附常见问题解决)

本文提供了一份详尽的Outlook日历同步指南,帮助用户在Windows 10、安卓和iOS三端实现无缝衔接。文章深入解析了Exchange ActiveSync等核心同步原理,并给出了从账户创建到各设备(特别是华为手机)的具体配置步骤、进阶管理技巧以及针对同步失败、事件重复等常见问题的实战解决方案,旨在彻底解决跨平台日程管理的痛点。

l3m4n的博客 554

Android自定义ListView实现QQ空间顶部效果

Android自定义ListView实现QQ空间顶部效果转载请注明出处: (一) 效果图: QQ空间原图: (二)布局分析 1、首先先分析一下上图的View组成部分,可以很明显的看出View是由: Listview+headView和TopBar两部分组成 2、然后是上面的TopBar的渐变效果,我们的重点就是在这个渐变效果上。

飞渡浮舟 2184

【chips】个人笔记系列-SystemVerilog

个人整理的Systemverilog笔记。

Hide_in_Code 2060

Android实现QQ空间图片下拉变大效果(雷惊风)

当我们打开QQ控件时,向下滑动他头部的图片,你会发现有变大的效果,这个效果实现起来并不难,下面咱们一起来实现一下。    首先我们分析一下,因为QQ空间里除了这张图片下边还有很多我们好友发布的消息甚至是比好友发的消息还多的广告,而且是一条一条的,包含了不同的布局,有的有图片,有的都是纯文本,有的既有文本又有图片等等等等,其实这些就是简单的ListView通过给头部添加包含图片的Header布局,

刘永雷的专栏 3434

《计算机网络》课程大作业- 《小区局域网的设计和规划》

8.1首先,在满足用户需求方面,通过详细的需求分析,充分考虑了居民和物业管理的不同业务需求。对于居民,无论是日常的高清视频播放、在线游戏、远程办公还是智能家居设备的连接,网络都能提供稳定的高速带宽支持。从有线网络的千兆以太网技术保障稳定的有线连接,到无线网络采用 Wi - Fi 6 技术确保无线覆盖区域的高速和低延迟,满足了居民多样化的娱乐和生活需求。对于物业管理,安防监控系统的实时数据传输、物业办公自动化系统的流畅运行以及社区信息的及时发布等业务,都有针对性的网络设计。

lisangsimida的博客 2599

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

php 微信 图片 文字 朋友圈,朋友圈实现图片+文字转发功能(必看篇)

朋友圈实现图片+文字转发功能(必看篇)朋友圈只能转发图片intent.putExtra(Intent.EXTRA_TEXT, "qqqq");//这个属性在朋友圈无法显示intent.putExtra("Kdescription","ppppp");//但是用这个属性,就可以显示文字了intent.setType("image/*;text/plain");// 同时可以发送图片和文字以上这篇朋友...

weixin_33487490的博客 888

从零到一,打造你的无人机侦察兵!树莓派+Python+MQTT,实时目标检测全攻略

物联网、人工智能与计算机视觉三大前沿技术的深度融合。

u013558123的博客 1473

android listivew 下拉回弹刷新

该效果是一名国外工程师(johannilsson)的代码,拿来研究了下,自己整合了一下,现在拿出来,跟大家一起分享。 再次感谢这位国外工程师(johannilsson),谢谢! 新浪微博,和QQ空间里面,都有那个下拉刷新的效果,另很多人眼前一亮,细细分析,原理原来如此。 在原作者的基础上,写了一些注释,和帮助大家更好的阅读理解,(可能其中有些地方注释不准,欢迎指正,谢谢) 下面,就亮出关键...

gaofen100 157

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1384

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android之listivew实现下拉刷新

新浪微博,和QQ空间里面,都有那个下拉刷新的效果,另很多人眼前一亮,细细分析,原理原来如此。 在原作者的基础上,写了一些注释,和帮助大家更好的阅读理解,(可能其中有些地方注释不准,欢迎指正,谢谢) 源代码下载地址:http://download.youkuaiyun.com/detail/weidi1989/4588246 先来看一下效果图: 下面,就亮出关键代码,自定义的一个MyListVi...

way 128

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

仿ios listview反弹效果

前几天项目中要用到ios自带的反弹效果,就去看了下源码,其实我们android,反弹效果是有的,方法和实现都写好了。。。。。     整个实现重点在overScrollBy这个方法上,当你滚动listview时会触发此事件,它会根据表头或表尾的坐标,及你所给的maxOverScrollY最大滚动纵坐标值来计算listview的表头或表尾的坐标。        默认的ListView

churck_android 794

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android:仿手机QQ好友动态的ListView

1.介绍:本博客使用XListView模仿Android版QQ好友动态的ListView效果。效果截图如下:效果图1效果图2这里面主要涉及的是ListView的布局问题,让我们看一下Item的布局文件吧。 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/con

郑海波(莫川)的优快云博客 5680

Android中ListView的回弹效果

listView的 回弹效果 类似 ios的ScrollView 滚动到 最顶部或者最底部。 通过 重写 ListView的 overscrollby方法实现 //弹性效果,maxOverScrollY最大滚出距离默认0 @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,

米小豆的博客 1295

仿QQ聊天-listView的item多布局

仿QQ聊天界面以及聊天气泡。.9图片制作以及黑边处理。

lhp15575865420的博客 2013

android仿QQ下拉回弹效果

最近在做android页面 总觉得QQ的scrollView还是比较好的。下拉到顶部的时候,往上拉了一点然后添了点动画 这种感觉能够增加用户体验的感觉。 因此觉得想着来实现一下。看一下QQ里面的效果。     闲话少说,动手干吧。百度搜了一下,感觉还是比较晕,因为比较散,不过大概得到两到思路。一个offsetTopAndBottom这个方法。另一个就是重写ScrollView。按照道理来

@EddieYuan 5508

Android精仿淘宝/QQ空间标题栏渐变效果

最近在淘宝上囤年货买买买的时候,注意到淘宝购物详情页的渐变效果,觉得效果还是挺不错的,有种似曾相识的感觉,没错,好像QQ空间的标题栏也是类似的做法。鉴于这种效果在平时可能会用得比较多,所以就自己研究了一下然后把它实现出来了,项目完整demo在文章底部有链接,大家可下载参考研究。文章原创,转载请注明地址:小嵩的优快云博客,地址:http://blog.youkuaiyun.com/qq_22393017本文会详

小嵩的博客 6500

Android仿QQ空间

今天模仿安卓QQ空间,效果如下:      打开程序的启动画面和导航页面我就不做了,大家可以模仿微信的那个做一下,很简单。这次主要做一下主页面的实现,下面是主页面的布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent

极致的专注 无限的热情 1万+
上一篇: svn-eclipse插件的安装
下一篇: android 加载大图片适配问题解决方案
zhoushenxian
博客等级 码龄12年 453粉丝 549原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值