android開發-簡單動畫1

因爲要實現在錄像界面做個掃描的動效,就是類似於二維碼掃描的那種動效,所以簡單做了下這方面的。這裏大概也是有幾種方法的。
第一種是通過繼承 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種方法則不是這樣,記在下一篇吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章