实现思路:
首先自定义SurfaceView作为图片的容器,然后自定义一个类来存储图片、图片高度、当前绘制的位置,然后将这些信息放入一个List中,然后将其作为一个循环队列即可
SurfaceView的实现如下
主要在于第一张已经从屏幕滚出后将其移到List 的最后等待循环进行绘制播放
public class BackSurfaceView extends SurfaceView implements SurfaceHolder.Callback ,Runnable{
private Context context;
private List<BackImageInfo> backBitmap=new LinkedList<>();
private SurfaceHolder holder;
private static int viewHeight;
public BackSurfaceView(Context context) {
this(context,null);
}
public BackSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context=context;
holder=getHolder();
holder.addCallback(this);
LoadBackImage();
}
/**
* 根据资源名获取资源id,也可以通过R.drawable.class反射进行回去
*/
public void LoadBackImage(){
for(int i=1;i<=3;i++){
int id=getResources().getIdentifier("a"+i,"drawable",context.getPackageName());
Bitmap bitmap=BitmapFactory.decodeResource(getResources(), id);
int height=bitmap.getHeight();
BackImageInfo info=new BackImageInfo(bitmap,height);
backBitmap.add(info);
}
}
public void drawBackImage(){
Canvas canvas=holder.lockCanvas();
BackImageInfo info=backBitmap.get(0);
canvas.drawBitmap(info.getBitmap(),0,info.getCurrentPos(),null);
if(info.getCurrentPos()>0){//当第一张图片绘制坐标大于原点时,计算第二张图片的坐标进行绘制
BackImageInfo info2=backBitmap.get(1);
info2.calculteCuurentPos(info.getCurrentPos());
canvas.drawBitmap(info2.getBitmap(),0,info2.getCurrentPos(),null);
}
if(info.getCurrentPos()>=viewHeight){//当第一张图片已滚出屏幕则将其移到最后
backBitmap.remove(0);
backBitmap.add(info);
}
info.setCurrentPos(info.getCurrentPos()+1);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void run() {
while(true) {
drawBackImage();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
viewHeight=getHeight();
int height=backBitmap.get(0).getHeight();
backBitmap.get(0).setCurrentPos(viewHeight - height);
new Thread(this).start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
图片信息类
public class BackImageInfo {
private Bitmap bitmap;
private int height;
/**
* 当前图片左上角距离View组件左上角的距离
*/
private int currentPos;
public BackImageInfo(Bitmap bitmap, int height) {
this.bitmap = bitmap;
this.height=height;
}
//当成为第二张时,用来计算绘制坐标
public void calculteCuurentPos(int subHeight){
currentPos=subHeight-height;
}
public Bitmap getBitmap() {
return bitmap;
}
public int getCurrentPos() {
return currentPos;
}
public void setCurrentPos(int currentPos) {
this.currentPos = currentPos;
}
public int getHeight() {
return height;
}
}