Android SurfaceView

下面就贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置


代码:

Activity

package com.view;
 
 import android.app.Activity;
 import android.os.Bundle;
 import android.view.Window;
 import android.view.WindowManager;
 
 public class MainActivity extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         // 隐藏状态栏
         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
 
         // 把Activity的标题去掉
         requestWindowFeature(Window.FEATURE_NO_TITLE);
 
         // 设置布局
         this.setContentView(new MySurfaceView(this));
     }
 }

SurfaceView

package com.view;
 
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.SurfaceHolder;
 import android.view.SurfaceHolder.Callback;
 import android.view.SurfaceView;
 
 public class MySurfaceView extends SurfaceView implements Runnable, Callback {
 
     private SurfaceHolder mHolder; // 用于控制SurfaceView
 
     private Thread t; // 声明一条线程
 
     private boolean flag; // 线程运行的标识,用于控制线程
 
     private Canvas mCanvas; // 声明一张画布
 
     private Paint p; // 声明一支画笔
 
     private int x = 50, y = 50, r = 10; // 圆的坐标和半径
 
     public MySurfaceView(Context context) {
         super(context);
 
         mHolder = getHolder(); // 获得SurfaceHolder对象
         mHolder.addCallback(this); // 为SurfaceView添加状态监听
         p = new Paint(); // 创建一个画笔对象
         p.setColor(Color.WHITE); // 设置画笔的颜色为白色
         setFocusable(true); // 设置焦点
     }
 
     /**
      * 自定义一个方法,在画布上画一个圆
      */
     public void Draw() {
         mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画
         mCanvas.drawRGB(0, 0, 0); // 把画布填充为黑色
         mCanvas.drawCircle(x, y, r, p); // 画一个圆
         mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上
     }
 
     /**
      * 当SurfaceView创建的时候,调用此函数
      */
     @Override
     public void surfaceCreated(SurfaceHolder holder) {
         t = new Thread(this); // 创建一个线程对象
         flag = true; // 把线程运行的标识设置成true
         t.start(); // 启动线程
     }
 
     /**
      * 当SurfaceView的视图发生改变的时候,调用此函数
      */
     @Override
     public void surfaceChanged(SurfaceHolder holder, int format, int width,
             int height) {
     }
 
     /**
      * 当SurfaceView销毁的时候,调用此函数
      */
     @Override
     public void surfaceDestroyed(SurfaceHolder holder) {
         flag = false; // 把线程运行的标识设置成false
     }
 
     /**
      * 当屏幕被触摸时调用
      */
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标
         y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标
         return true;
     }
     
     /**
      * 当用户按键时调用
      */
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         if(keyCode == KeyEvent.KEYCODE_DPAD_UP){    //当用户点击↑键时
             y--;    //设置Y轴坐标减1
         }
         return super.onKeyDown(keyCode, event);
     }
 
     @Override
     public void run() {
         while (flag) {
             Draw(); // 调用自定义画画方法
             try {
                 Thread.sleep(50); // 让线程休息50毫秒
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }
 
 }

MySurfaceView首先继承SurfaceView,然后实现Runnable和Callback接口

重写了Runnable的run方法和Callback的surfaceCreated(SurfaceHolder holder),surfaceChanged(SurfaceHolder holder, int format, int width,int height),surfaceDestroyed(SurfaceHolder holder)方法,

还实现了onTouchEvent(MotionEvent event),onKeyDown(int keyCode, KeyEvent event)方法来,详细的在代码里已注释。






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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值