surfaceview

package com.example.surfaceviewtest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

import java.util.Random;   

import android.content.Context;   
import android.graphics.Canvas;   
import android.graphics.Color;   
import android.graphics.Paint;   
import android.graphics.Rect;
import android.os.Bundle;   
import android.view.MotionEvent;   
import android.view.SurfaceHolder;   
import android.view.SurfaceHolder.Callback;   
import android.view.SurfaceView;   
import android.view.Window;   
import android.view.WindowManager;   
   
public class BallActivity extends Activity {   
    @Override   
    public void onCreate(Bundle savedInstanceState) {   
        super.onCreate(savedInstanceState);   
        //设置全屏    
        requestWindowFeature(Window.FEATURE_NO_TITLE);   
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,   
                WindowManager.LayoutParams.FLAG_FULLSCREEN);   
           
        setContentView(new BallSurfaceView(this));   
    }   
       
    class BallSurfaceView extends SurfaceView implements Callback,Runnable{   
        private int screenW;        //屏幕宽度    
        private int screenH;        //屏幕高度    
        private Paint paint;        //定义画笔    
        private int cx = 50;      //圆点默认X坐标    
        private int cy = 50;      //圆点默认Y坐标    
        private int radius = 20;   
        //定义颜色数组    
        private int colorArray[] = {Color.GREEN,Color.YELLOW,Color.BLUE,Color.CYAN};   
        //private int paintColor = colorArray[0]; //定义画笔默认颜色    
        private Canvas canvas = null; //定义画布    
        private Thread th = null;     //定义线程    
        private SurfaceHolder sfh = null;   
           
        public BallSurfaceView(Context context){   
            super(context);   
            /*备注1:在此处获取屏幕高、宽值为0,以为此时view还未被创建,  
             * 在接口Callback的surfaceCreated方法中view才被创建  
             */   
            /*screenW = getWidth();  
            screenH = getHeight();*/   
               
            //初始化画笔    
            initPaint();   
            sfh = getHolder();   
            sfh.addCallback(this);   
            th = new Thread(this);   
        }   
           
        @Override   
        public void surfaceCreated(SurfaceHolder holder) {   
            //获取屏幕宽度    
            screenW = getWidth();   
            //获取屏幕高度    
            screenH = getHeight();   
            //启动绘图线程    
            th.start();   
        }   
           
        private void initPaint(){   
            paint = new Paint();   
            //设置消除锯齿    
            paint.setAntiAlias(true);   
            //设置画笔颜色    
            //paint.setColor(paintColor);
            paint.setColor(Color.GREEN);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(6);

        }   
           
        @Override   
        public void run() {   
            while(true){   
                try{   
                    myDraw();    
                    Thread.sleep(100);   
                }catch(InterruptedException e){   
                    e.printStackTrace();   
                }   
            }   
        }   
           
        /*备注2:切记,在自定SurfaceView中定义的myDraw方法,自定义View(继承自View的子类)中的onDraw方法  
         * 完全是两码事:  
         * 1)自定义View(继承自View的子类)中的onDraw方法是重写父类的onDraw方法,在调用postInvalidate后会自动回调该onDraw()方法。  
         * 2)此处的myDraw方法需要手动调用,所以此处故意将方法命名为myDraw,突出为该方法是自己写的,非重写父类的方法 。  
         *   
         */   
        //重写onDraw方法实现绘图操作    
        protected void myDraw() {   
            //获取canvas实例    
            canvas = sfh.lockCanvas();   
            //将屏幕设置为白色    
            if(null!=canvas){
            canvas.drawColor(Color.WHITE);   
            //修正圆点坐标    
            revise();   
            //随机设置画笔颜色    
            setPaintRandomColor();   
            //绘制小圆作为小球    
           // canvas.drawCircle(cx, cy, radius, paint); 
            canvas.drawRect(new Rect(cx, cy, cx+120, cy+120), paint); 
            //将画好的画布提交    
            sfh.unlockCanvasAndPost(canvas);  
            }
        }   
           
        //为画笔设置随机颜色    
        private void setPaintRandomColor(){   
            Random rand = new Random();   
            int randomIndex = rand.nextInt(colorArray.length);   
            paint.setColor(colorArray[randomIndex]);   
        }   
//           
        //修正圆点坐标    
        private void revise(){   
            if(cx <= radius){   
                cx = radius;   
            }else if(cx >= (screenW-radius)){   
                cx = screenW-radius;   
            }   
            if(cy <= radius){   
                cy = radius;   
            }else if(cy >= (screenH-radius)){   
                cy = screenH-radius;   
            }   
        }   
           
        @Override   
        public boolean onTouchEvent(MotionEvent event) {   
            switch (event.getAction()) {   
            case MotionEvent.ACTION_DOWN:   
                // 按下    
                cx = (int) event.getX();   
                cy = (int) event.getY();   
                break;   
            case MotionEvent.ACTION_MOVE:   
                // 移动    
                cx = (int) event.getX();   
                cy = (int) event.getY();   
                break;   
            case MotionEvent.ACTION_UP:   
                // 抬起    
                cx = (int) event.getX();   
                cy = (int) event.getY();   
                break;   
            }   
               
            /*  
             * 备注1:次处一定要将return super.onTouchEvent(event)修改为return true,原因是:  
             * 1)父类的onTouchEvent(event)方法可能没有做任何处理,但是返回了false。  
             * 2)一旦返回false,在该方法中再也不会收到MotionEvent.ACTION_MOVE及MotionEvent.ACTION_UP事件。  
             */   
            //return super.onTouchEvent(event);    
            return true;     
        }   
           
        @Override   
        public void surfaceChanged(SurfaceHolder holder, int format, int width,   
                int height) {   
        }   
           
        @Override   
        public void surfaceDestroyed(SurfaceHolder holder) {   
        }   
           
    }   
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值