仿QQ空间头部下拉放大控件

看了QQ动脑学院关于Android课程后编写的,下面直接上干货:

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.ImageView;
import android.widget.ListView;

/**
 * 仿QQ空间头部下拉 图片放大
 * Created by Mr.ZAN on 2017/7/28.
 */

public class ScrollZoomListView extends ListView {

    private ImageView mImageView;
    private int mImageViewHeight;//初始高度
    public ScrollZoomListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mImageViewHeight=context.getResources().getDimensionPixelSize(R.dimen.defult_image_height_size);

    }

    public void setZoomImageView(ImageView iv){
        mImageView=iv;
    }
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
        //下拉过度的回调监听
        /**
         * 两种情况
         * deltaY: -  下拉过度
         * deltaY: + 上拉过度
         */
        if (deltaY < 0) {//下拉过度
            //imageview进行放大效果----修改image 的高度
            mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY;
            mImageView.requestLayout();
        } else {//上拉过度
            mImageView.getLayoutParams().height = mImageView.getHeight() - deltaY;
            mImageView.requestLayout();
        }

        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        //往上推 图片缩小
        View header= (View) mImageView.getParent();
        //listView 会滑出去的高度(负数)
        int deltaY=header.getTop();
        //只有当image被放大才执行缩小
        if (mImageView.getHeight()>mImageViewHeight) {
            mImageView.getLayoutParams().height = mImageView.getHeight() + deltaY;
            //由于滑出去一段,所以要让header父容器重新摆放top为0
            header.layout(header.getLeft(),0,header.getRight(),header.getHeight());
            mImageView.requestLayout();
        }
        super.onScrollChanged(l, t, oldl, oldt);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action=ev.getAction();
        //当手指抬起 并且图片有放大时执行回弹效果
        if (action==MotionEvent.ACTION_UP && mImageView.getHeight() > mImageViewHeight) {

                //渐渐恢复原来的高度----渐变动画:height
                ResetAnmiation resetAnmiation = new ResetAnmiation();
                resetAnmiation.setDuration(500);
                mImageView.startAnimation(resetAnmiation);
            int i = mImageView.getHeight() - mImageViewHeight;
            Log.d("++ Mr ZAN ++", "onTouchEvent: " + i);
        }
        return super.onTouchEvent(ev);
    }
    public class  ResetAnmiation extends Animation{

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
          //动画执行百分比 ,interpolatedTime:  0f~1f
            /**比例关系
             * 0 ~ 1
             * height~ 初始高度
             * 现在的高度-(变化的高度差) * interpolatedTime
             */
            mImageView.getLayoutParams().height = (int) ((mImageView.getHeight() - (mImageView.getHeight()-mImageViewHeight))*interpolatedTime);
            mImageView.requestLayout();

            super.applyTransformation(interpolatedTime, t);
        }
    }
}

 

用法:

 

public class MainActivity extends AppCompatActivity {


    private List<String> mList =new ArrayList<>();
    private ScrollZoomListView mListView;

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = (ScrollZoomListView) findViewById(R.id.listview);

        View view1=LayoutInflater.from(this).inflate(R.layout.header,null);

        ImageView imageView =view1.findViewById(R.id.iv_header);
        ImageView head =view1.findViewById(R.id.iv_icon);
        mListView.addHeaderView(view1);
        mListView.setZoomImageView(imageView);
        initdata();

        ListAdapter adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,mList);
        mListView.setAdapter(adapter);


    }
    public void initdata(){
        for (int i = 0; i < 10; i++) {
            mList.add("条目   "+i);
        }
    }


}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值