Android实现下拉放大图片松手自动反弹效果

本文实例为大家分享了Android实现下拉放大图片松手自动反弹的具体代码,供大家参考,具体内容如下

直接看效果:

下面就是代码

HeadZoomScrollView类

import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ScrollView; 

/**
 * Created by BAIPEI on 2017/11/21.
 */ 

public class HeadZoomScrollView extends ScrollView {
  private View mZoomView;
  private int mZoomViewWidth;
  private int mZoomViewHeight; 

  private float firstPosition;//记录第一次按下的位置
  private boolean isScrolling;//是否正在缩放
  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);
  } 

  public void setmZoomView(View mZoomView) {
    this.mZoomView = mZoomView;
  } 

  public void setmScrollRate(float mScrollRate) {
    this.mScrollRate = mScrollRate;
  } 

  public void setmReplyRate(float mReplyRate) {
    this.mReplyRate = mReplyRate;
  } 

  @Override
  protected void onFinishInflate() {
    super.onFinishInflate();
    init();
  } 

  private void init() {
    setOverScrollMode(OVER_SCROLL_NEVER);
    if (getChildAt(0) != null) {
      ViewGroup vg = (ViewGroup) getChildAt(0);
      if (vg.getChildAt(0) != null) {
        mZoomView = vg.getChildAt(0);
      }
    }
  } 

  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (mZoomViewWidth <= 0 || mZoomViewHeight <= 0) {
      mZoomViewWidth = mZoomView.getMeasuredWidth();
      mZoomViewHeight = mZoomView.getMeasuredHeight();
    }
    switch (ev.getAction()) {
      case MotionEvent.ACTION_UP:
        //手指离开后恢复图片
        isScrolling = false;
        replyImage();
        break;
      case MotionEvent.ACTION_MOVE:
        if (!isScrolling) {
          if (getScrollY() == 0) {
            firstPosition = ev.getY();// 滚动到顶部时记录位置,否则正常返回
          } else {
            break;
          }
        }
        int distance = (int) ((ev.getY() - firstPosition) * mScrollRate); // 滚动距离乘以一个系数
        if (distance < 0) { // 当前位置比记录位置要小,正常返回
          break;
        } 

        // 处理放大
        isScrolling = true;
        setZoom(distance);
        return true; // 返回true表示已经完成触摸事件,不再处理
    }
    return true;
  } 

  //回弹动画
  private void replyImage() {
    float distance = mZoomView.getMeasuredWidth() - mZoomViewWidth;
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(distance, 0f).setDuration((long) (distance * mReplyRate));
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
        setZoom((Float) animation.getAnimatedValue());
      }
    });
    valueAnimator.start();
  } 

  public void setZoom(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));
    ((MarginLayoutParams) lp).setMargins(-(lp.width - mZoomViewWidth) / 2, 0, 0, 0);
    mZoomView.setLayoutParams(lp);
  } 

} 

MainActivity里面没有写代码就不粘了

下面是布局activity_main

<bwie.com.pulllistview.HeadZoomScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/scrollView"
  android:layout_width="match_parent"
  android:layout_height="match_parent"> 

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"> 

    <ImageView
      android:id="@+id/iv_show"
      android:layout_width="match_parent"
      android:layout_height="200dp"
      android:layout_weight="1"
      android:src="@drawable/a1"/>
    <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="数据1"/>
    <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="数据2"/>
    <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="数据3"/>
    <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="数据4"/> 

  </LinearLayout> 

</bwie.com.pulllistview.HeadZoomScrollView> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Android ListView实现下拉顶部图片变大效果
  • Android仿QQ好友详情页下拉顶部图片缩放效果
  • Android DragImageView实现下拉拖动图片放大效果
  • android ScrollView实现下拉放大头部图片
  • Android自定义scrollView实现顶部图片下拉放大
  • Android开发重写Animation实现下拉图片后弹射回去效果示例
(0)

相关推荐

  • Android ListView实现下拉顶部图片变大效果

    本文实例为大家分享了Android ListView下拉顶部图片变大的具体代码,供大家参考,具体内容如下 在git上查看牛人的代码,发现是反编译别人的代码,还没加注释,代码也没有完全编译完整,所以这里我做的简单的注释,仅供学习. 变量说明 这里变量包含了:自定义返回动画加速度.自定义动画线程.头部图片view,最后的y坐标,做好的比例,做大的比例等. private static final String TAG = "PullToZoomListView"; private stat

  • Android开发重写Animation实现下拉图片后弹射回去效果示例

    本文实例讲述了Android开发重写Animation实现下拉图片后弹射回去效果.分享给大家供大家参考,具体如下: 1. 解析: 1)interpolatedTime指的是平移的变化率(从0到1) 2)mStartHeight 控件开始的高度 3)endHeight 控件竖直移动后的高度 4)mImageView.requestLayout(); 图片在改变高度后填充布局并固定 5)ValueUtil.evalute(interpolatedTime, mStartHeight, mEndHei

  • Android DragImageView实现下拉拖动图片放大效果

    DragImageView下拉拖动图片放大,先上图: 主要的类:继承了RelativeLayout,再在RelativeLayout里面添加ImageView,通过Touch事件来改变ImageView的缩放,缩放时计算scale,使其在手指移动到屏幕底部时,图片底部也刚好到达屏幕底部,手指松开时,图片逐步回弹. package com.example.dragimagescale; import android.annotation.SuppressLint; import android.a

  • Android仿QQ好友详情页下拉顶部图片缩放效果

    本文实例为大家分享了Android下拉顶部图片缩放效果展示的具体代码,供大家参考,具体内容如下 效果图 效果分析 1 向下滑动,头部的图片随着手指滑动不断变大 2 向上滑动,不断的向上移动图片,直到图片不可见 3 当顶部图片不可见时,向上滑动,滑动ListView 实现思路 1 由于这个View分上下两部分,垂直排列,可以通过继承LinearLayout实现::自定义一个DragImageView,该View继承LinearLayout public DragImageView(Context

  • Android自定义scrollView实现顶部图片下拉放大

    本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下 之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦,也不方便复用.这几天有空,所以重新使用自定义scrollView的方法实现这个效果.原理和之前的基本是一致的,所以也不多说了,直接上代码. package com.example.myapplication.dropzoom; import android.animation.ObjectAnim

  • android ScrollView实现下拉放大头部图片

    前言 之前做项目的时候,需要实现类似微博个人主页的ScrollView效果,就是到顶部时继续下拉会放大顶部的图片.然后在网上找了一篇相关的实现,效果非常好,代码也很简洁易懂.(传送门: 自定义scrollView实现顶部图片下拉放大),那么我这里就只是在其基础上修改了一点点而已,比如在代码中控制图片居中.增加动态设置放大的控件.使用自定义的最大放大倍数等,都是很简单的修改,还添加了滑动的监听回调(项目需要). 效果如下: 思路 老样子,我们先来说下思路,比起代码,思路才是最重要的.具体步骤如下:

  • Android实现下拉放大图片松手自动反弹效果

    本文实例为大家分享了Android实现下拉放大图片松手自动反弹的具体代码,供大家参考,具体内容如下 直接看效果: 下面就是代码 HeadZoomScrollView类 import android.animation.ValueAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; i

  • Android简洁的下拉放大刷新效果示例

    序言 国庆放假过后眼看一年又要过完了,年初指望着已经有一年的经验本以为自己不是刚出校的学生以为翅膀已经硬了,打算辞职换新工作,一面试才发现自己就是个垃圾,什么oninterceptEvent,dispatchTouchEvent ,Aysnctask都不会.做了一年的项目也是用的Xutils2.6版本 还有一堆不常用不好的不主流不时尚的框架,技术也没任何长进.还好公司真的轻松(所以也学不到任何东西)可以趁闲下来的时间多学点东西.于是写了个简单但也有需求的控件练练手. 首先先看效果图吧 这个是li

  • 解决iOS11图片下拉放大出现信号栏白条的bug问题

    废话不多说了,具体解决方法如下所示: if(@available(iOS11.0, *)) { self.tableView.contentInsetAdjustmentBehavior=UIScrollViewContentInsetAdjustmentNever; }else{ // Fallback on earlier versions self.automaticallyAdjustsScrollViewInsets=NO; } 项目中很多下拉图片放大的效果,使用上面官方给出的iOS1

  • Android ListView下拉刷新上拉自动加载更多DEMO示例

    代码下载地址已经更新.因为代码很久没更新,已经很落伍了,建议大家使用RecyclerView实现. 参考项目: https://github.com/bingoogolapple/BGARefreshLayout-Android https://github.com/baoyongzhang/android-PullRefreshLayout 下拉刷新,Android中非常普遍的功能.为了方便便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能.设计最初是参考开源中国的And

  • Android自定义控件下拉刷新实例代码

    实现效果: 图片素材: --> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml: <resources> <string name="app_name">PullToRefreshTest</string> <string name="pull_to_refresh">下拉可以刷新</string> <string name="release_to_refre

随机推荐