Android 自定义ScrollView - 头部可拉伸

【Android】头部背景图片可伸缩的ScrollView 1、需求 1、头部ImageView可伸缩,且不能影响其他控件摆放位置。 2、期望:可以自动识别ImageView位置,不用指定缩放View。 3、可以指定是否横向拉伸。 4、可以设置纵向平移的View。 2、实现方式 1、使用纯动画方式实现 经实践,使用纯动画方式可以实现头部图片伸缩效果,但是图片下方的布局不会跟着平移。本以为属性动画中的缩放动画是修改了控件的宽高实现,但实际来看并不是,那究竟属... 阅读详情

一、直接上代码

public class HeadZoomScrollView extends ScrollView {

    //头部View
    private View mZoomView;
    // View的宽度
    private int mZoomViewWidth;
    // View的高度
    private int mZoomViewHeight;

    //是否在滑动
    private boolean isScrolling = false;
    //第一次按下的坐标
    private float firstPosition;
    //缩放系数
    private float mScrollRate = 0.3f;
    //回弹系数
    private float mReplyRate = 0.5f;

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

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

    public HeadZoomScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }

    /**
     * 布局加载完后调用此方法,
     * 根据xml布局getChildAt(0)拿到的是LinearLayout,vg.getChildAt(0)拿到的是RelativeLayout。
     */
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        // 判断指定位置的视图是否为空。
        if(getChildAt(0) != null){
            // 返回组中指定位置的视图。
            ViewGroup vg = (ViewGroup) getChildAt(0);
            if (vg.getChildAt(0) != null){
                // 拿到所需的视图
                mZoomView = vg.getChildAt(0);
            }
        }
    }

    /**
     * 触摸事件
     * @param ev
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // 获取mZoomView的宽高
        if (mZoomViewWidth <= 0 || mZoomViewHeight <= 0){
            mZoomViewWidth = mZoomView.getMeasuredWidth();
            mZoomViewHeight = mZoomView.getMeasuredHeight();
        }
        // 返回正在执行的操作的类型。
        switch (ev.getAction()){
            case MotionEvent.ACTION_MOVE: // 滑动
                if (!isScrolling){
                    // 等于0说明没有滑动,是第一次滑动,记录第一次按下的坐标
                    if (getScrollY() == 0) {
                        firstPosition = ev.getY();
                    }else {
                        break;
                    }
                }
                // 计算缩放值
                // 公式:(当前的位置 - 第一次按下的位置) * 缩放系数
                int distance = (int) ((ev.getY() - firstPosition) * mScrollRate);
                if (distance < 0) {
                    break;
                }
                isScrolling = true;
                setZoomView(distance);
                break;
            case MotionEvent.ACTION_UP: // 抬起
                isScrolling = false;
                replyZoomView();
                break;
        }


        return true;
    }

    /**
     * 回弹动画
     */
    private void replyZoomView() {
        // ViewGroup.LayoutParams lp = mZoomView.getLayoutParams();
        // lp.width = mZoomViewWidth;
        // lp.height = mZoomViewHeight;
        // ((MarginLayoutParams)lp).setMargins(0,0,0,0);
        // mZoomView.setLayoutParams(lp);

        // 计算下拉的缩放值再让属性动画根据这个值复原
        // 现在的宽 - 原本的宽
        int distance = mZoomView.getMeasuredWidth() - mZoomViewWidth;
        // 实现属性动画
        ValueAnimator valueAnimator = ValueAnimator
                .ofFloat(distance, 0)
                .setDuration((long) (distance * mReplyRate));
        // 将监听器添加到在动画生命周期内发送更新事件的监听器集中。需要添加监听器否则调用start(),也没有效果
        valueAnimator.addUpdateListener(animation -> {
            setZoomView((Float) animation.getAnimatedValue());
        });
        valueAnimator.start();
    }

    /**
     * 缩放View
     * @param zoom
     */
    private void setZoomView(float zoom) {
        if (mZoomViewWidth <= 0 || mZoomViewHeight <= 0){
            return;
        }
        // 获取布局参数对象,设置宽高
        ViewGroup.LayoutParams lp = mZoomView.getLayoutParams();
        lp.width = (int)(mZoomViewWidth + zoom);
        // 公式:现在的宽 / 原本的宽 得到 缩放比例 * 原本的高 得到缩放的高
        lp.height = (int)(mZoomViewHeight * ((mZoomViewWidth + zoom) / mZoomViewWidth));
        // 设置间距
        // 公式:- (lp.width - mZoomViewWidth) / 2
        ((MarginLayoutParams)lp).setMargins(- (lp.width - mZoomViewWidth) / 2,0,0,0);
        mZoomView.setLayoutParams(lp);
    }
}

二、使用

<com.chenfuhai.framework.view.HeadZoomScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <!--头部-->
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="240dp">
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/img_me_bg" />
        </RelativeLayout>

        <!--个人信息-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <!--个人信息-->
            <LinearLayout
                android:id="@+id/ll_me_info"
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:background="@android:color/white"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingLeft="15dp"
                android:paddingRight="15dp">
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/img_user_info_icon" />
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_weight="1"
                    android:text="@string/text_me_item_title_1"
                    android:textColor="@android:color/black" />
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/img_right_arrow" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</com.chenfuhai.framework.view.HeadZoomScrollView>

三、注意事项

1、ScrollView继承自ViewGroup,所以ScrollView属于自定义ViewGroup。

Android进阶之路 - 拉伸的弹簧效果 因为在一些app中看到了图片的下拉放大,同时自带回弹的效果,所以在网上找了一个,同时尝试实现了一下,勉强满足基本需求,所以在此用于记录,可直接copy使用... 阅读详情

相关推荐

Unity基础篇-----Input输入

2、Input.GetTouch()方法,主要用于移动端开发使用,此方法主要获取触摸屏幕的操作数据,首先通过Input.touchCount这个方法获取到手指触摸屏幕的次数,通过GetTouch方法传输触摸次数,调用Touch结构判断手指的状态来是否为设定的状态,符合的话则执行相关内容。参数(“Horizontal”)表示左右的值,值为-1时,表示你在一直按下左方向对应的按键、设备类型为手柄时,表示你把推杆推到了最左边,为0时为默认位置,手柄中对应正中间,为1时与-1时对应的情况正好相反。

why820mmm的博客 3495

Android自定义ScrollView实现拉伸效果

ScrollView在项目中使用的特别多但如果想实现那种下拉或者上滑时带有拉伸感的就需要自己继承ScrollView去重写里面的方法了,今天就实现一下自定义ScrollView。 定义一个名为DefinitionScrollView的类代码如下 package com.ranlegeran.leranfinancial.view; import android.content.Context; ...

然了个然 1187

流媒体弱网优化之路(NACK)——纯NACK方案的优化探索

流媒体学习之路(NACK)——纯NACK方案的最高性能 文章目录流媒体学习之路(NACK)——纯NACK方案的最高性能一、NACK简介二、Nack的理解2.1 一种补救策略2.2 什么时候要?2.3 要多少?2.4 怎么要?三、计算分析3.1 rtt强相关3.2 补包次数计算3.3 Nack的定时发送3.4 nack重传限制四、实验   近期在针对纯丢包场景做一些简单的探索实验,一个让我困扰的问题就是:不使用FEC而只是通过纯NACK进行补偿,到底能在实验环境下抵抗多少的丢包呢?每一次丢包补偿的最大时长

qw225967的博客 1万+

android 滑动scrollview 头部标题透明度改变

/AGB由相关工具获得,或者美工提供。//待修改头部 图片视频控件 高度 测试。// 只是layout背景透明(仿知乎滑动效果)

Ivory_wiki的博客 806

混合整数规划(MIP)在资源优化中的实战应用

本文深入探讨了混合整数规划(MIP)在资源优化中的实战应用,从菜市场采购到工厂调度,再到物流配送和钢铁厂切割问题。通过分支定界法和割平面法等技术,MIP能够有效解决包含整数和连续变量的复杂优化问题,提升企业运营效率。文章还介绍了现代求解器的优化策略和实际项目中的避坑指南,帮助读者更好地应用MIP技术。

weixin_30500105的博客 91

上位机图像处理和嵌入式模块部署(qmacvisual获取边界点)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在图像处理中,解决了分割的问题之后,下面就是属性信息的提取。在这其中,有一种属性是非常重要的 ,那就是外界轮廓的边界点获取。这个边界点,可以用来计算长度,也可以用来进行直线、圆的拟合,具体的用途取决于现场的实际使用场景。目前qmacvisual支持对边界点的提取,相关控件可以直接用来提取边界点。

嵌入式-老费,一个分享专业嵌入式知识的blog 883

Android设置ScrollView回到顶部的三种方式

一、ScrollView.scrollTo(0,0)  直接置顶,瞬间回到顶部,没有滚动过程,其中Y值可以设置为大于0的值,使Scrollview停在指定位置; 二、ScrollView.fullScroll(View.FOCUS_UP)  类似于手动拖回顶部,有滚动过程; 三、ScrollView.smoothScrollTo(0, 0) 类似于手动拖回顶部,有滚动过程,其中Y值可以设置为大

xuanhg221的博客 1万+

LDRA Testbed软件静态分析_操作指南

从本文起,将开始LDRA Testbed(TBrun)教程的系列文章,包括软件静态分析、单元测试、集成测试,以及基于Testbed的自动化工具开发、持续集成、常见问题解答等。LDRA公司是专业的软件测试工具与测试技术、咨询服务提供者,其总部位于英国利物浦。其旗舰产品Testbed/TBrun功能全面、易于使用,不仅适合于主机平台软件测试,同时适合于嵌入式软件测试。不仅能进行软件静态测试,还能进行软件单元测试、软件集成测试,在白盒测试领域运用比较广泛。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1万+

android 自定义ScrollView控件上拉和下拉有拉伸效果

普通的scrollView下拉到顶部时就不动了,而如qq设置界面中的布局,下拉到顶端时还能下拉一段距离。此自定义scrollView就可以实现这样的效果。       这是我在网上找的自定义scrollView代码,会用就行了。 首先,自定义UserDefineScrollView控件。 UserDefineScrollView.java文件: package com.

fxjzzyo的博客 4193

第78篇:AI辅助创意与设计工作流——Logo、海报、UI的自动化生成与迭代(操作教程)

在广告公司和设计团队摸爬滚打几年,我见过太多设计师为一个Logo的配色、一张海报的版式反复修改到深夜。自从AI绘画工具爆发,我就一直在琢磨,怎么把这些“黑科技”真正塞进设计师的日常流水线里,而不是让它们仅仅是个玩具。今天要聊的,就是一套我实践下来,能真正提升效率的AI辅助创意与设计工作流。我们不谈颠覆,只谈增效——如何用AI快速完成Logo、海报、UI的灵感生成、批量出图与智能迭代,把设计师从重复劳动中解放出来,聚焦在真正的创意决策上。

weixin_37464284的博客 539

【Linux命令大全】006.网络通讯之netstat命令(实操篇)

本文详细介绍了Linux系统中netstat网络诊断命令的实用技巧。主要内容包括:1) 基本功能与参数详解,展示如何查看网络连接、路由表和接口统计;2) 安装方法及基础用法,如查看TCP/UDP连接、显示进程信息和路由表;3) 高级应用技巧,包括监听端口检查、连接状态统计和实时监控。文章通过表格和代码示例,系统性地呈现了netstat在系统管理中的核心应用场景,是网络故障排查和性能监控的实用指南。

yuhuasheng1997的博客 706

Android 沉浸式状态栏 头部可拉伸带有一键置顶功能

一:实现沉浸式状态栏,头部可以拉伸,头部图片可下拉放大,带有一键置顶功能  先看看三个步骤: 1:在AndroidManifest.xml中设置Activity的属性为android:theme="@android:style/Theme.NoTitleBar" 2:在Layout的第一个布局中设置与头部的间隔(android:layout_marginTop="25dp",当然具体间隔多少...

shenggaofei的博客 1849

ios开发拒绝“玄学”Crash:从循环引用到脏内存,构建你的系统性排查思维模型

你申请了内存,写了数据,这块内存就是脏的。系统无法直接回收它,除非你显式释放,或者系统把它 swap 出去(但在 iOS 上,Compressed Memory 机制虽然能压缩,但不会像桌面系统那样频繁 swap 到磁盘,一旦压缩内存也撑不住,你也得挂)。所以,排查 OOM 的核心心法只有一条:不要问“哪里漏了”,要问“每一刻,留在这个页面上的内存,凭什么必须在这里?一旦内存水位线逼近阈值(不同机型不同,老机器可能 600MB 就危,新机器能抗 1.5GB),系统发个警告。

大模型大数据攻城狮的专栏 724

沉浸式状态栏+头部拉伸+一键置顶

一些普通的界面加上这些效果应该还是不错的,所以就抽空写了这个小小的demo. Demo传送门 : http://download.youkuaiyun.com/detail/as_jon/9651533思路: 1.沉浸式状态栏 : 修改系统状态栏属性,使他始终与顶部导航栏色值一样. 2.头部拉伸跟一键置顶 : 自定义 Scroll View ,获取界面滑动高度,然后做出相应的操作.代码如下:Main A

总之岁月漫长,然而值得等待。 4695

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VC中sqlite的使用

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

可拉伸头部控件

可拉伸头部控件 原理:滑动时设置包含背景控件的大小。 自定义属性: values>attrs.xml xml version="1.0" encoding="utf-8"?> name="TractionScrollView"> name="bg" format="reference" /> name="head" format="ref

melody534056585的博客 840

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android自定义view仿写QQ空间可拉伸头部控件

先来看下仿照QQ空间顶部图片过度下拉时,顶部图片放大回弹的效果,完整项目:https://github.com/buder-cp/CustomView/tree/master/buder_DN_view/buderdn20 业务逻辑包括:顶部图片可以下拉,当过度下拉时会有顶部图片放大的效果,在松手时会有顶部图片回弹效果。 我们看下大致看下需要重写哪些方法才能完成上面的需求。 首先肯定要有...

王温暖的博客 619

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

仿QQ空间之打造个性化可拉伸头部控件

最近有研究了QQ空间可拉伸头部控件的listView。如何去做呢?这里使用了自定义listView的方法。先看效果图吧:究竟如何去做呢? 可以用的方法有: * 1.继承 extends ViewGrop * 2.RecycleView +Behavior+CoordinateLayout * 3.ViewGroup 组合控件 * 4.ListView + headView这次我们主要

这个时代,作为程序员可能要学习小程序 2089

ScrollView的拉伸效果

  /* * @Comment :下拉回弹效果 * @Created :2018/7/6 11:20 * @Name : YJ */public class BounceScrollView extends ScrollView { private static final String TAG = "BounceScrollView"; private View ...

lanrenxiaowen的博客 425

Android沉浸式状态栏 + scrollView顶部伸缩 + actionBar渐变

因为文件太多,全部展示会影响篇幅,暂时就先列举这些部分截图。

2301_79655511的博客 835

android 底部上拉界面,Android 上拉下拉界面的弹性ScrollView效果实现

1.需求:像Ios那样上拉下拉实现动画回弹效果效果图:2.具体实现:继承ScrollView,重写dispatchTouchEvent()方法,判断上下滑动,计算距离,手指松开后实现动画效果,回到正常布局位置。实现代码:package com.mingyansu.splash;import android.annotation.SuppressLint;import android.content...

weixin_35986497的博客 683

自定义ScrollView 实现图片放大,上滑修改标题栏状态

一.功能介绍自定义ScrollView实现图片拉伸效果,下拉放大头部图片,监听滑动,改变标题头部是个图片,下面是个WebView,滑动改变标题状态;二.代码介绍1.自定义ScrollView ,重写onTouchEvent()方法,监听触摸下拉 上滑位置,实现图片放大以及回弹;@Override public boolean onTouchEvent(MotionEvent ev) { ...

shanshan_1117的博客 472

下拉顶部拉伸效果

如图下拉时顶部拉伸效果 代码如下: 创建:DampView public class DampView extends ScrollView { private static final int LEN = 0xc8; private static final int DURATION = 500; private static final int MAX_DY = 200; priva...

weixin_33739541的博客 182

[Android] 带阻尼效果的可拉伸的HorizontalScrollView

昨天美工说需要带苹果的带阻尼效果的可拉伸的HorizontalScrollView。然后花了几个小时实现了效果。 代码如下: package view; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.Moti

darling_shadow的专栏 3155

下拉头布局,弹簧效果,头布局滑动和ScrollVIew滑动冲突的解决

package com.zft.tygj.view; import android.animation.ValueAnimator; import android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Lo...

Fan的博客 413

Android中ScrollView实现拖拽反弹效果动画

public class BounceScrollView extends ScrollView { private View inner;// 孩子View private float y;// 点击时y坐标 private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.) privat

道哥的技术博客 4815

上下拉伸图片-第三方开源-PullToZoomListViewEx 实现阻尼效果

本文要说的PullToZoomScrollViewEx 实现阻尼效果 什么是阻尼效果。简单解释就是一张图片,当你按住向下拖动,图片跟着拉升方大,当你松开时,回弹到原来的效果,在Android 上我们这种效果叫做阻尼效果。 这里我们用一个第三的 PullToZoomScrollViewEx 来实现,他的原理是自己定义的view 继承的我们ScrollView,设置我们初始的高度,然后实现下拉的

qq_35816104的博客 1459
上一篇: Android 时间戳工具类
下一篇: Android RecyclerView适配器封装
Android Hai
博客等级 码龄7年 30粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android Hai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值