PullScrollView进阶(二)-----图片下拉回弹(简易QQ空间下拉效果)

2024-08-31 23:48

本文主要是介绍PullScrollView进阶(二)-----图片下拉回弹(简易QQ空间下拉效果),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果是:下拉上边那个图片会相应放大,我主要是实现QQ空间里面那个效果,给出一个思路即可,具体希望网友给出建议


activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageViewandroid:id="@+id/background_img"android:layout_width="match_parent"android:layout_height="300dp"android:layout_marginTop="-100dp"android:scaleType="fitXY"android:src="@drawable/pic3" /><com.example.pullscrollview.CustomScrollViewandroid:id="@+id/pullscrollview"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="100dp"android:scaleType="fitXY"android:src="@drawable/pic3" /></com.example.pullscrollview.CustomScrollView></FrameLayout>

MainActivity

package com.example.pullscrollview;import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView background_img = (ImageView) findViewById(R.id.background_img);CustomScrollView customScrollView = (CustomScrollView) findViewById(R.id.pullscrollview);customScrollView.setmHeaderView(background_img);}}

CustomScrollView

package com.example.pullscrollview;import android.content.Context;
import android.graphics.Rect;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationSet;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;public class CustomScrollView extends ScrollView {// 图片控件视图private View mRootView;// 用来保存手指的当前位置坐标值private int mpreY = 0;// 初始化图片视图的矩形区域坐标位置private Rect mNormalRect;private Context context;// 底部图片private View mHeaderView;/*** 构造器* @param context* @param attrs*/public CustomScrollView(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;}/*** onFinishInflate()函数,明显是在布局解析结束后会调用的函数。* 获取scrollView的孩子view控件*/@Overrideprotected void onFinishInflate() {mRootView = getChildAt(0);super.onFinishInflate();}/*** dp转px*/public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** 根据手机的分辨率从 px(像素) 的单位 转成为 dp*/public static int px2dip(Context context, float pxValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (pxValue / scale + 0.5f);}public void setmHeaderView(View view) {mHeaderView = view;}/*** 在onTouchEvent()中根据手指的移动距离,通过layout()函数将布局跟随移动即可*/@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN: {// 获取手指当前的位置y轴坐标mpreY = (int) event.getY();if (mRootView != null) {// 进行布局位置--获取图片初始化的矩形区域mNormalRect = new Rect(mRootView.getLeft(), mRootView.getTop(),mRootView.getRight(), mRootView.getBottom());Log.e("TAG", ""+px2dip(context, mRootView.getTop()));//100dpLog.e("TAG", ""+px2dip(context, mRootView.getBottom()));//612dp}}break;case MotionEvent.ACTION_MOVE: {//获取目前的移动的y轴值float curY = event.getY();// 获取手指移动的距离--乘以0.25是凸显阻尼效果int delta = (int) (curY - mpreY);// 根据手指滑动的距离,进行重新布局那个图片View控件!!!!!!!!!!!!//将移动的距离转为dp进行判断int deltaDP = px2dip(context, delta);int deltaPx = dip2px(context, 100);if (deltaDP <= 100) {mRootView.layout(mRootView.getLeft(), mNormalRect.top + 2* delta, mRootView.getRight(), mNormalRect.bottom + 2* delta);mHeaderView.layout(mRootView.getLeft(), dip2px(context, -100)+ delta, mRootView.getRight(), dip2px(context, 200)+ delta);} else {mRootView.layout(mRootView.getLeft(), mNormalRect.top + 2* deltaPx, mRootView.getRight(), mNormalRect.bottom + 2* deltaPx);}}break;case MotionEvent.ACTION_UP: {//回归mHeaderView.layout(mRootView.getLeft(), dip2px(context, -100),mRootView.getRight(), dip2px(context, 200));// 回归到初始化的那个矩形位置即可mRootView.layout(mNormalRect.left, mNormalRect.top,mNormalRect.right, mNormalRect.bottom);}break;}// 保存每次手指移动的最新位置return super.onTouchEvent(event);}}


这篇关于PullScrollView进阶(二)-----图片下拉回弹(简易QQ空间下拉效果)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125344

相关文章

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4