因爲要實現在錄像界面做個掃描的動效,就是類似於二維碼掃描的那種動效,所以簡單做了下這方面的。這裏大概也是有幾種方法的。
第一種是通過繼承 android.view.View 類,並實現其中的 onDraw()函數來實現繪製的工作,繪製的工作主要由android.graphics 包來實現。
public class SlideViewSingleSelfVideoActivity extends View {
private Paint paint; // 畫筆對象的引用
private int slideTop; // 中間滑動線的最頂端位置
private int slideBottom; // 中間滑動線的最底端位置
private int slideLeft; // 中間滑動線的最左邊位置
private int slideRight; // 中間滑動線的最右邊位置
private int lastY = 350;
public SlideViewSingleSelfVideoActivity(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
surfaceholder.setFormat(PixelFormat.TRANSPARENT); // 設置爲透明
// setZOrderOnTop(true); // 設置視圖在頂層
}
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.TRANSPARENT); // 這裏是繪製背景
paint = new Paint();
paint.setAntiAlias(true); // 反鋸齒
//獲取屏幕的寬高
int width = canvas.getWidth();
slideLeft = 50;
slideRight = width - slideLeft;
slideTop = lastY;
slideBottom = lastY + 5;
//繪製中間的線,每次刷新界面,中間的線往下移動SPEEN_DISTANCE
paint.setColor(Color.RED); // 將畫筆設置成紅色
canvas.drawRect(slideLeft, slideTop, slideRight, slideBottom, paint);
}
/*
* 定時器,讓畫動起來
*/
private Timer timer;
private TimerTask task;
private Handler handler;
private void start(int lastY){
if(mReadyTimer == null) {
mReadyTimer = new Timer();
}
mReadyTask = new TimerTask() {
public void run() {
mReadyHandler.sendEmptyMessage(0);
}
};
mReadyTimer.schedule(mReadyTask, 0, 500);
mReadyHandler = new Handler() {
public void handleMessage(Message msg) {//分發消息
super.handleMessage(msg);
if (0 == msg.what ) {
lastY += 20; // 向下
// 不斷的調用View中的postInvalidate方法,讓界面重新繪製
this.postInvalidate();
//this.invalidate(); 此方法要求在UI主線程調用
if(lastY > 1100)
lastY = 350;
}
}
};
}
}
所以,這裏只要在活動中生成該類的對象,然後調用start函數就可以了。
當然這裏也可以不用定時器,用線程也可以,利用線程的sleep函數來達到定時器的效果。代碼可以這樣改一下。
public class SlideViewSingleSelfVideoActivity extends View implements Runnable{
private Paint paint; // 畫筆對象的引用
private int slideTop; // 中間滑動線的最頂端位置
private int slideBottom; // 中間滑動線的最底端位置
private int slideLeft; // 中間滑動線的最左邊位置
private int slideRight; // 中間滑動線的最右邊位置
private int lastY = 350;
public SlideViewSingleSelfVideoActivity(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
surfaceholder.setFormat(PixelFormat.TRANSPARENT); // 設置爲透明
// setZOrderOnTop(true); // 設置視圖在頂層
//啓動線程
new Thread(this).start();
}
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.TRANSPARENT); // 這裏是繪製背景
paint = new Paint();
paint.setAntiAlias(true); // 反鋸齒
//獲取屏幕的寬高
int width = canvas.getWidth();
slideLeft = 50;
slideRight = width - slideLeft;
slideTop = lastY;
slideBottom = lastY + 5;
//繪製中間的線,每次刷新界面,中間的線往下移動SPEEN_DISTANCE
paint.setColor(Color.RED); // 將畫筆設置成紅色
canvas.drawRect(slideLeft, slideTop, slideRight, slideBottom, paint);
}
/*
* 讓畫動起來
*/
@Override
public void run() {
while(true){
lastY += 20; // 向下
// 不斷的調用View中的postInvalidate方法,讓界面重新繪製
this.postInvalidate();
//this.invalidate(); 此方法要求在UI主線程調用
if(lastY > 1100)
lastY = 350;
try {
// 暫停0.5秒繼續
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
兩個其實是差不多的。這裏都是利用postInvalidate函數和onDraw函數來重新繪製的,因爲postInvalidate在運行過程中會自動調用onDraw。還有2種方法則不是這樣,記在下一篇吧。