android 自定义view实现自动相册功能

这个有点类似跑马灯的效果,其实就是不断的drawBitmap到画布上,然后根据view的宽度去计算,超过view的宽度就从左边开始绘制,这是这篇博客的思路:

直接贴代码了,要下班了

package com.q42.android.scrollingimageview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import com.anim.R;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * Created by admin on 2016/12/28.
 */
public class CustomScrollView extends View {
    private int[] scene;
    private int maxBitmapHeight = 0;
    private static final String TAG ="CustomScrollView";
    private float speed = 2;//滑动的速度
    private int sceneLength = 100;
    private List<Bitmap> bitmaps;//存放图片的集合
    private float offset = 0;
    private int index = 0;
    private  int bitmapsSize = 0;
    private int viewWidth;
    private int height;
    private boolean isStarted;
    private int[] randomness = new int[]{1,5,1,1,1,1,3,1};
    private int[] srcIds = {R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e,R.drawable.f,
    R.drawable.g,R.drawable.h};
    public CustomScrollView(Context context) {
        this(context,null);
    }
    public CustomScrollView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init() {
        for (int r : randomness) {
            bitmapsSize += r;//bitmapsSize = 15;
        }
        bitmaps = new ArrayList<>(randomness.length);
        for (int i = 0; i < randomness.length; i++) {
            int multiplier = 1;
            if (randomness.length > 0 && i < randomness.length) {
                multiplier = Math.max(1, randomness[i]);
            }
            Bitmap bitmap =  BitmapFactory.decodeResource(getResources(),srcIds[i]);
            for (int m = 0; m < multiplier; m++) {//这是
                bitmaps.add(bitmap);
            }
            maxBitmapHeight = Math.max(bitmap.getHeight(), maxBitmapHeight);
        }
        Random random = new Random();
        this.scene = new int[sceneLength];
        for (int i = 0; i < this.scene.length; i++) {
            this.scene[i] = random.nextInt(bitmaps.size());
        }
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        viewWidth = w;
        height = h;
    }
    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (canvas == null || bitmaps.isEmpty()) {
            return;
        }
        while (offset <= -getBitmap(index).getWidth()) {
            offset += getBitmap(index).getWidth();
            index = (index + 1) % scene.length;
        }
        float left = offset;
        for (int i = 0; left < viewWidth; i++) {
            Bitmap bitmap = getBitmap((index + i) % scene.length);
            int width = bitmap.getWidth();
            canvas.drawBitmap(bitmap, left, 0, null);
            left += width;
        }
        if (isStarted && speed != 0) {//
            offset -= Math.abs(speed);
            postInvalidateOnAnimation();
        }
    }
    private Bitmap getBitmap(int sceneIndex) {
        return bitmaps.get(scene[sceneIndex]);
    }
    /**
     * 开始绘制
     */
    public void start() {
        if (!isStarted) {
            isStarted = true;
            postInvalidateOnAnimation();
        }
    }
    /**
     * 停止绘制
     */
    public void stop() {
        if (isStarted) {
            isStarted = false;
            invalidate();
        }
    }
    @Override
    protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);
        if(visibility==View.VISIBLE){
            start();
        }else{
            stop();
        }
    }
}

效果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值