package frezc.loadingdemo.app2;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* Created by freeze on 2015/4/26.
*/
public class ScanlineAnimView extends SurfaceView
implements SurfaceHolder.Callback{
private SurfaceHolder holder;
private GradientDrawable gradientDrawable =
new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
new int[]{0xffF8F8F8,0xffF09199});
private DrawThread drawThread = new DrawThread();
public ScanlineAnimView(Context context) {
this(context, null);
}
public ScanlineAnimView(Context context, AttributeSet attrs) {
super(context, attrs);
gradientDrawable.setShape(GradientDrawable.RECTANGLE);
gradientDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
holder = getHolder();
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Canvas canvas = holder.lockCanvas();
canvas.drawColor(0xffF8F8F8);
holder.unlockCanvasAndPost(canvas);
drawThread.running=true;
drawThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
drawThread.running = false;
}
class DrawThread extends Thread{
Canvas canvas;
boolean running;
Rect dirty = new Rect(0,0,0,0);
int top=0,bottom=0;
int speed = 12;
int position = 0;
@Override
public void run() {
while (running){
if(position < (300 + speed)){
top = 0;
}else {
top = position - 300 - speed;
}
if(position > getMeasuredHeight()){
bottom = getMeasuredHeight();
}else {
bottom = position;
}
gradientDrawable.setBounds(0, top+speed, getMeasuredWidth(), position);
dirty.set(0,top,getMeasuredWidth(),bottom);
//清空
canvas = holder.lockCanvas(dirty);
gradientDrawable.draw(canvas);
holder.unlockCanvasAndPost(canvas);
position += speed;
if(position > getMeasuredHeight() + 300){
position = 0;
}
try {
sleep(33);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}