android实现多图片放大缩小的切换

  前天在网上看到了http://v.qq.com/vplus/56c7ec6c231bdbafd198c58fb86eb4dc 作者仿QQ的代码,看了一下感觉很受启发。正好,单位在做引导页的时候,要用到类似的东西,只不过是放大缩小的样子。好了,下面我们来看一下代码。
  

package com.example.cg.scaleimageview.Customs;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.example.cg.scaleimageview.R;

/**
 * 自定义控件,根据传入的图片组,对图片进行从小到大的显示
 * 作者:cg
 * 时间:2017/4/24 0024 上午 10:30
 */
public class ScaleImageView extends ImageView {

    private Drawable mDrawable;
    private Handler mHandler;

    private int[] imgSrc = new int[]{R.mipmap.mm1};

    private boolean isEnlarge = true;
    private float scaleNum = 1.0f;                              //图片初始放大的倍数
    private float scaleMaxNum = 1.2f;                           //图片最大会被放大多少,默认是1.2倍
    private float scaleValue = 0.002f;                          //图片每次放大缩小的倍数
    private int num = 1;                                        //当前显示到第几个图

    public ScaleImageView(Context context) {
        this(context,null);
    }

    public ScaleImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

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

        TypedArray array = context.getTheme().obtainStyledAttributes(attrs,R.styleable.ScaleImageView,defStyleAttr,0);
        int n = array.getIndexCount();
        for(int i=0;i<n;i++)
        {
            int arr = array.getIndex(i);
            switch (arr)
            {
                case R.styleable.ScaleImageView_isEnlarge:
                    isEnlarge = array.getBoolean(arr,true);
                    break;
                case R.styleable.ScaleImageView_scaleMaxNum:
                    scaleMaxNum = array.getFloat(arr,1.2f);
                    break;
                case R.styleable.ScaleImageView_scaleValue:
                    scaleValue = array.getFloat(arr,0.002f);
                    break;
            }
        }
        array.recycle();

        if(!isEnlarge)
        {
            scaleNum = scaleMaxNum;
        }

        //初始化第一个图
        mDrawable=getDrawable();
        mHandler=new ScaleImageView.MoveHandler();
        mHandler.sendEmptyMessageDelayed(1, 220L);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.scale(scaleNum,scaleNum,getMeasuredWidth()/2,getMeasuredHeight()/2);

        mDrawable.draw(canvas);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        if(isEnlarge) {
            mDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
        }else{
            int mCanvasWBgSize = Math.round(getMeasuredWidth() * scaleMaxNum);
            int mCanvashBgSize = Math.round(getMeasuredHeight() * scaleMaxNum);

            int leftRight = (mCanvasWBgSize - getMeasuredWidth())/2;
            int topBottom = (mCanvashBgSize - getMeasuredHeight())/2;

            mDrawable.setBounds(-leftRight,-topBottom,getMeasuredWidth() + leftRight,getMeasuredHeight() + topBottom);
        }

    }

    private class MoveHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            /**
             * 此处进行判断,如果小于最大倍数,就不断放大,如果大于了最大或等于最大倍数,就进行换图
             */
            if(isEnlarge) {
                if (scaleNum < scaleMaxNum) {
                    scaleNum += scaleValue;
                    invalidate();
                    mHandler.sendEmptyMessageDelayed(1, 22);
                } else {
                    scaleNum = 1.0f;
                    setImageResource(imgSrc[num % 3]);
                    mDrawable = getDrawable();
                    num++;
                    invalidate();
                    mHandler.sendEmptyMessageDelayed(1, 22);
                }
            }else{

                if(scaleNum >= 0.9) {
                    scaleNum -= 0.002;
                    invalidate();
                    mHandler.sendEmptyMessageDelayed(1, 22);
                }else {
                    scaleNum = scaleMaxNum;

                    //如果图片只有一个,哪就循环此图片,不用更新
                    if(imgSrc.length!=1) {
                        setImageResource(imgSrc[num % 3]);
                        mDrawable = getDrawable();
                        num++;
                    }

                    invalidate();
                    mHandler.sendEmptyMessageDelayed(1, 22);
                }

            }
        }
    }

    /**
     * 加载图片列表
     * @param images   图片列表
     */
    public void setImages(int[] images)
    {
        this.imgSrc = images;
        invalidate();
    }
}

代码中我加了详细的注解。都不难理解。
下载
CSDN下载地址
gitHub下载地址
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值