Android中在Fragment中利用scrollView实现图片下拉效果。

本文介绍了如何在Android的Fragment中利用ScrollView实现图片下拉时的拉伸和回弹缩放效果,主要涉及XML布局和Fragment中的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网上有很多相关的介绍,当然这篇也是参考网上的代码整理出来的。
首先,是xml中的布局,只贴出主要的布局:

<ScrollView
    android:id="@+id/scollview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    <ImageView
        android:id="@+id/imgage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:scaleType="centerCrop"
        android:orientation="vertical"
        android:background="@mipmap/green_foot"
        >
    </ImageView>
</ScrollView>

其次,就是在Fragment中代码的实现:
网上代码:

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

    metric=new DisplayMetrics();
   getActivity(). getWindowManager().getDefaultDisplay().getMetrics(metric);

    //获取控件
    scrollView = (ScrollView)view. findViewById(R.id.scollview);
    imageView = (ImageView) view.findViewById(R.id.imgage);

    //设置图片初始大小  这里设为满屏的16:9
    ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) imageView.getLayoutParams();
    lp.width = metric.widthPixels;
    lp.height = metric.widthPixels * 9 / 16;
    imageView.setLayoutParams(lp);

    //监听滚动事件
    scrollView.setOnTouchListener(new View.OnTouchListener() {
        @SuppressLint({ "ClickableViewAccessibility", "NewApi" })
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) imageView.getLayoutParams();
            switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                    //手指离开后恢复图片
                    mScaling = false;
                    replyImage();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (!mScaling) {
                        if (scrollView.getScrollY() == 0) {
                            mFirstPosition = event.getY();// 滚动到顶部时记录位置,否则正常返回
                        } else {
                            break;
                        }
                    }
                    int distance = (int) ((event.getY() - mFirstPosition) * 0.5); // 滚动距离乘以一个系数,可修改
                    if (distance < 0) { // 当前位置比记录位置要小,正常返回
                        break;
                    }

                    // 处理放大
                    mScaling = true;
                    lp.width = metric.widthPixels + distance;
                    lp.height = (metric.widthPixels + distance) * 9 / 16;
                    imageView.setLayoutParams(lp);
                    return true; // 返回true表示已经完成触摸事件,不再处理
            }
            return false;
        }
    });

}


// 回弹动画 (使用了属性动画)
public void replyImage() {
    final ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) imageView.getLayoutParams();
    final float w = imageView.getLayoutParams().width;// 图片当前宽度
    final float h = imageView.getLayoutParams().height;// 图片当前高度
    final float newW = metric.widthPixels;// 图片原宽度
    final float newH = metric.widthPixels * 9 / 16;// 图片原高度
    // 设置动画
    ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration(200);

    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float cVal = (Float) animation.getAnimatedValue();
            lp.width = (int) (w - (w - newW) * cVal);
            lp.height = (int) (h - (h - newH) * cVal);
            imageView.setLayoutParams(lp);
        }
    });
    anim.start();

}

这样就有可以实现一个图片下拉拉伸,回弹缩放效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值