这个有点类似跑马灯的效果,其实就是不断的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(); } } }
效果: