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

本文实例为大家分享了scrollView实现顶部图片下拉放大的具体代码,供大家参考,具体内容如下

之前的scrollView顶部图片下拉放大在之后的项目用到了几次,但没次都写在Activity中很麻烦,也不方便复用。这几天有空,所以重新使用自定义scrollView的方法实现这个效果。原理和之前的基本是一致的,所以也不多说了,直接上代码。

package com.example.myapplication.dropzoom; 

import android.animation.ObjectAnimator;
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 Liujinhua on 2016/3/25.
 * 下拉放大scrollView
 */
public class DropZoomScrollView extends ScrollView implements View.OnTouchListener { 

  // 记录首次按下位置
  private float mFirstPosition = 0;
  // 是否正在放大
  private Boolean mScaling = false; 

  private View dropZoomView;
  private int dropZoomViewWidth;
  private int dropZoomViewHeight; 

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

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

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

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

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

  } 

  private void init() {
    setOverScrollMode(OVER_SCROLL_NEVER);
    if (getChildAt(0) != null) {
      ViewGroup vg = (ViewGroup) getChildAt(0);
      if (vg.getChildAt(0) != null) {
        dropZoomView = vg.getChildAt(0);
        setOnTouchListener(this); 

      }
    }
  } 

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

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

  // 回弹动画 (使用了属性动画)
  public void replyImage() {
    final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth; 

    // 设置动画
    ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration((long) (distance * 0.7)); 

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
        float cVal = (Float) animation.getAnimatedValue();
        setZoom(distance - ((distance) * cVal));
      }
    });
    anim.start(); 

  } 

  //缩放
  public void setZoom(float s) {
    if (dropZoomViewHeight <= 0 || dropZoomViewWidth <= 0) {
      return;
    }
    ViewGroup.LayoutParams lp = dropZoomView.getLayoutParams();
    lp.width = (int) (dropZoomViewWidth + s);
    lp.height = (int) (dropZoomViewHeight * ((dropZoomViewWidth + s) / dropZoomViewWidth));
    dropZoomView.setLayoutParams(lp);
  }
} 

使用的时候也十分的简单

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"> 

  <com.example.myapplication.dropzoom.DropZoomScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 

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

      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/bg" /> 

      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/home_bg" /> 

      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/home_bg" /> 

      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/home_bg" /> 

      <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/home_bg" />
    </LinearLayout>
  </com.example.myapplication.dropzoom.DropZoomScrollView>
</LinearLayout> 

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

(0)

相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  • android 自定义ScrollView实现背景图片伸缩的实现代码及思路

       用过多米音乐的都市知道, 这个UI可以上下滑动,作用嘛---无聊中可以划划解解闷,这被锤子公司老罗称谓为"情怀",其实叫"情味"更合适.嘿嘿.如今挪动互联网开展这么迅速,市场上已不再是那早期随便敲个APP放上架就能具有几十万用户的阶段了.近来苹果公司,为了怕android下载量赶超苹果商店,大势宣称:(第 500 亿个下载应用的用户就能够获得 10,000 美元的 iTunes 礼品卡,除此之外,紧随第 500 亿以后的前 50 名用户也可以获得 500 美元

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

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

  • 一个方法搞定iOS下拉放大及上推缩小

    下面这种效果在ios应用中很常见: 实现思路: 1、创建头部的视图和tableview,需要注意的是tableview要设置contentInset,contentInsent 的顶部要和头部视图的背景图的高度一样,否则会有空隙(或是有遮挡). myTableView.contentInset = UIEdgeInsetsMake(headRect.size.height-navHeight-navHeight, 0, 0, 0); 2、对头部视图的背景图片的尺寸进行处理,当然,你也可以直接找一

  • Android自定义实现顶部粘性下拉刷新效果

    本文实例为大家分享了Android实现顶部粘性下拉刷新效果的具体代码,供大家参考,具体内容如下 学习:视频地址 activity_view_mv代码 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sche

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

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

  • Android 自定义 HorizontalScrollView 打造多图片OOM 的横向滑动效果(实例代码)

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

  • Android Scroll实现弹性滑动_列表下拉弹性滑动的示例代码

    我这一次讲使用scroll实现弹性滑动,我不会只有一个例子就说完,因为写文章的时候我也在学习,我分几次讲完吧. 首先上一段代码, private void smoothScrollByScroller(int dy){ mScroller.startScroll(0,dy,0,dy*-1,1000); invalidate(); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scr

随机推荐