欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中SurfaceView用法简单实例

程序员文章站 2023-11-26 17:09:10
本文实例讲述了android中surfaceview用法。分享给大家供大家参考,具体如下: 这里贴上一个小程序代码,主要运用surfaceview来实现在屏幕上画一个圆,...

本文实例讲述了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)方法来,详细的在代码里已注释。

希望本文所述对大家android程序设计有所帮助。