Android Surface Viewの概要

19935 ワード

概要:Surface ViewはViewから継承されていますが、Viewとは異なり、ViewはUIマスタースレッドで画面を更新しますが、Surface Viewは新しいスレッドで画面を更新します.Viewの特性は、画面を更新するのに適していないことを決定します.画面を更新する時間が長すぎると、UIスレッドは描かれている関数でブロックされるため、Androidは通常Surface Viewでアニメーション効果を行います.
以下に、Surface Viewを使用した簡単な例を示します.
package com.yw.myapiupdate.mydraw;







import android.app.Activity;

import android.os.Bundle;

import android.view.Display;



/**

 * 

 * @author yw-tony

 *

 */

public class MyDrawActivity extends Activity{

    private SurfaceViewBall ball ;

    private int width = 0;

    private int height = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Display display = getWindowManager().getDefaultDisplay();

        width = display.getWidth();

        height = display.getHeight();

        

        

        ball = new SurfaceViewBall(this,width,height);

        /*ball.setOnTouchListener(new OnTouchListener() {

            float x = 0;

            float y = 0;

            @Override

            public boolean onTouch(View v, MotionEvent event) {

                switch(event.getAction()){

                case MotionEvent.ACTION_DOWN://  

                    

                    ball.drawThread.top += event.getY();

                    ball.drawThread.left += event.getX();

                    ball.drawThread.buttom += event.getY();

                    ball.drawThread.right += event.getX();

                    break;

                case MotionEvent.ACTION_MOVE://  

                    //  xy     

                    //       (x,y)

                    x = event.getRawX();

                    y = event.getRawY();

                    x = ((ball.drawThread.right - ball.drawThread.left)/2);

                    y = (ball.drawThread.buttom - ball.drawThread.top)/2;

                    

                    

                    ball.drawThread.top = (int) (event.getRawY()+y);

                    ball.drawThread.left = (int) (event.getRawX()+x);

                    ball.drawThread.right = (int)(200+event.getX()+x);

                    ball.drawThread.buttom = (int)(200+event.getY()+y);

                    

                    

                    

                    log.e("getRawX", ""+event.getRawX());

                    log.e("getRawY", ""+event.getRawY());

                    log.e("getX", ""+event.getX());

                    log.e("getRawY", ""+event.getY());

                    

//                    ball.drawThread.top += 20;

//                    ball.drawThread.left += event.getRawX();

//                    ball.drawThread.buttom += event.getRawY();

//                    ball.drawThread.right += event.getRawX();

                    break;

                case MotionEvent.ACTION_UP://  

                    ball.drawThread.top += 20;

                    ball.drawThread.buttom += 20;

                    ball.drawThread.top += event.getRawY();

                    ball.drawThread.left += event.getRawX();

                    ball.drawThread.buttom += event.getRawY();

                    ball.drawThread.right += event.getRawX();

                    break;

                }

                return true;

            }

        });*/

        setContentView(ball);

    }

    /**

     *       

     */

    /*@Override

    public boolean onTouchEvent(MotionEvent event) {

        switch(event.getAction()){

        case MotionEvent.ACTION_DOWN://  

            ball.drawThread.top += event.getY();

            ball.drawThread.left += event.getX();

            ball.drawThread.buttom += event.getY();

            ball.drawThread.right += event.getX();

            break;

        case MotionEvent.ACTION_MOVE://  

            ball.drawThread.top += event.getRawY();

//            ball.drawThread.left += event.getRawX();

//            ball.drawThread.buttom += event.getRawY();

//            ball.drawThread.right += event.getRawX();

            break;

        case MotionEvent.ACTION_UP://  

            ball.drawThread.top += event.getRawY();

            ball.drawThread.left += event.getRawX();

            ball.drawThread.buttom += event.getRawY();

            ball.drawThread.right += event.getRawX();

            break;

        }

        

        return true;

    }*/

    @Override

    public void onBackPressed() {

        ball.drawThread.isRun = false;

        super.onBackPressed();

    }

}

MySurfaceView.java
package com.yw.myapiupdate.mydraw;



import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Rect;

import android.view.SurfaceHolder;

import android.view.SurfaceView;



public class SurfaceViewBall extends SurfaceView implements SurfaceHolder.Callback{

    private SurfaceHolder holder;

    public DrawThread drawThread ;

    private int width = 0;//    

    private int height = 0;//    

    public SurfaceViewBall(Context context,int width ,int height) {

        super(context);

        holder = this.getHolder();//  surfaceHolder  

        // holder      

        holder.addCallback(this);

        drawThread = new DrawThread(holder);

        this.width = width;

        this.height = height;

    }

    /**

     *           

     */

    @Override

    public void surfaceChanged(SurfaceHolder holder, int format, int width,

            int height) {

        

    }

    /**

     *         

     */

    @Override

    public void surfaceCreated(SurfaceHolder holder) {

        drawThread.isRun = true;

        drawThread.start();

    }

    /**

     *         

     */

    @Override

    public void surfaceDestroyed(SurfaceHolder holder) {

        drawThread.isRun = false;

    }

    /**

     *        

     * @author yw-tony

     *

     */

    class DrawThread extends Thread{

        private SurfaceHolder drawHolder;

        public boolean isRun;

        public int top = 50;

        public int buttom = 250;

        public int left = 100;

        public int right = 300 ;

        public DrawThread(SurfaceHolder drawHolder){

            this.drawHolder = drawHolder;

        }

        @Override

        public void run() {

            int count = 0;

            boolean target = false;

            boolean targetHeightFlag = false;

            while(isRun){

                Canvas canvas = null;

                try{

                    synchronized (SurfaceViewBall.class) {

                        canvas = drawHolder.lockCanvas();//    

                        canvas.drawColor(Color.BLACK);//      

                        //    

                        Paint paint = new Paint();

                        paint.setTextSize(20.00f);

                        //         

                        paint.setColor(Color.WHITE);

                        //      

                        /*left = left +20;

                        right = right + 20;*/

                        /*             */

                        if(left <= 0){//

                            left = left +20;

                            right = right +20;

                            target   = false;

                        }else if(right >= width){//             

                            left = left -20;

                            right = right - 20;

                            target = true;

                        }else{

                            if(target){

                                left = left -20;

                                right = right - 20;

                            }else{

                                left = left +20;

                                right = right + 20;

                            }

                            

                        }

                        /*             */

                        if(top<=0){//        

                            top = top+10;

                            buttom = buttom + 10;

                            targetHeightFlag = false;

                        }else if(buttom >= height){//        

                            top = top-10;

                            buttom = buttom - 10;

                            targetHeightFlag = true;

                        }else{//       

                            if(targetHeightFlag){

                                top = top-10;

                                buttom = buttom - 10;

                            }else{

                                top = top+10;

                                buttom = buttom + 10;

                            }

                        }

                        

                        

                        

                        

                        Rect rect = new Rect(left,top,right,buttom);

                        //      

                        canvas.drawRect(rect, paint);

                        //    

                        canvas.drawText("   "+(count++)+" ", 100, 300, paint);

                        //     1 

                        if(canvas != null){

                            holder.unlockCanvasAndPost(canvas);//

                        }

                        Thread.sleep(50);

                    }

                }catch(Exception e){

                    

                }finally{

                }

            }

        }

    }

    

    

}