本文转自:http://hi.baidu.com/fqlibra/blog/item/0216d603876345c07b89478c.html

Android的大多数控件都是继承自View的,因此在自定义控件时一般也是继承View类,但是对于高效的,游戏级别的绘图,或者是播放器等要求比较高的地方,普通的View类就

有点吃不开了,这个时候就要用到SurfaceView类。
因为比较高级,所以就该装B,单纯一个继承自SurfaceView类是不行的,必须实现一个SurfaceHolder.Callback接口来指明SurfaceView创建、改变、删除时的回调方法,并且

在SurfaceView中通过一个SurfaceHolder对象来控制SurfaceView。
如果将该SurfaceView作为某个Activity的全屏View,则直接调用setContentView(new MyView());就好了;但若是作为屏幕View的一部份,就应该修改对应的layout XML文件

了,添加类似的布局代码:
    <com.example.fq.MyView
    android:id="@+id/sv"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
其中com.example.fq.MyView为对应自定义类的全名。
由于默认的XML文件解析方法是调用View的View(Context , AttributeSet )构造函数构造View,因此你的自定义SurfaceView中也应该有一个参数为(Context , AttributeSet )

的构造函数,并且在构造函数中执行父类的对应函数super( Context , AttributeSet )。

在绘图时,必须首先用Canvas c=holder.lockCanvas();锁定并获得画布,随后进行绘制,再调用holder.unlockCanvasAndPost(c);将绘制内容进行呈现

下面是个例子:
MyView.java:
public class MyView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder=null; //控制对象
private Vector<Float> xs=new Vector<Float>();
private Vector<Float> ys=new Vector<Float>();

public MyView(Context context,AttributeSet attr) {
   super(context,attr);
   // TODO Auto-generated constructor stub
   holder=getHolder();
   holder.addCallback(this);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
    int height) {
   // TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   new Thread(new MyLoop()).start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub

}

public void doDraw(Canvas canvas) {
   // TODO Auto-generated method stub
   super.onDraw(canvas);
   canvas.drawColor(Color.WHITE);//这里是绘制背景
   Paint p=new Paint(); //笔触
   p.setAntiAlias(true); //反锯齿
   p.setColor(Color.BLACK);
   p.setStyle(Style.STROKE);
   for(int i=0;i<xs.size();i++)
    canvas.drawCircle(xs.elementAt(i),ys.elementAt(i),10, p);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
   // TODO Auto-generated method stub
   if(event.getAction()==MotionEvent.ACTION_DOWN){
    xs.add(event.getX());
    ys.add(event.getY());
   }
   return true;
}

class MyLoop implements Runnable{
//熟悉游戏编程的应该很面熟吧,主循环
   @Override
   public void run() {
    // TODO Auto-generated method stub
    while(true){
     try{
      Canvas c=holder.lockCanvas();
      doDraw(c);
      holder.unlockCanvasAndPost(c);
      Thread.sleep(20);
     }catch(Exception e){
     
     }
    }
   }
  
}

}

Main.java
public class Main extends Activity {
private MyView sv=null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        sv=(MyView)findViewById(R.id.sv);
    }
}

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <com.example.fq.MyView
    android:id="@+id/sv"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
</LinearLayout>

转载于:https://www.cnblogs.com/freeliver54/archive/2012/01/20/2327844.html

[转]Android中在SurfaceView上高效绘图相关推荐

  1. Android中在SurfaceView上高效绘图

    Android的大多数控件都是继承自View的,因此在自定义控件时一般也是继承View类,但是对于高效的,游戏级别的绘图,或者是播放器等要求比较高的地方,普通的View类就 有点吃不开了,这个时候就要 ...

  2. Android中的SurfaceView详解

    Android中提供了View进行绘图处理,View可以满足大部分的绘图需求,但是有时候,View却显得力不从心,所以Android提供了SurfaceView给Android开发者,以满足更多的绘图 ...

  3. android sdcard 不存在,在android中显示sdcard上不存在的文件的提醒

    以下代码可正常运行,并播放sd卡上的音乐文件. 我想在sdcard上不存在音乐文件("不存在的音乐文件")时显示警报. 我该写些什么?在android中显示sdcard上不存在的文 ...

  4. android 调取数字键盘,如何在android中的EditText上显示数字键盘?

    如何在android中的EditText上显示数字键盘? 我只是想在某个EditText具有焦点时立即切换到数字键盘模式. 13个解决方案 239 votes 您可以为EditText配置EditTe ...

  5. android中使用SurfaceView做视频播放器--视频切换无缝连接

    Android中的视频用到的有view.SurfaceHolder和view.SurfaceView,还有就是用到了MediaPlayer.OnBufferingUpdateListener和Medi ...

  6. android中在progressBar上添加文字显示百分比进度

    工作中遇到ProgressBar上加文字显示的问题,在网上查了下,发现好多都说可以用TextProgressBar来实现,但具体的使用方法却没有.后来在一个黑客网站发现了一个方法.觉得还不错,所以拿来 ...

  7. Android中开发需要的高效助推的命令总结

    原文:http://blog.csdn.net/jiangwei0910410003/article/details/73385819 ​Android 开发中我们有时候需要借助一些命令帮助更好的高效 ...

  8. Android中使用SurfaceView和Canvas来绘制动画

    事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...

  9. Android中的自定义View以及绘图工具

    1.1自定义view的简介 为什么要使用自定义view 在Android开发中有很多业务场景,原生的控件是无法满足应用,并且经常也会遇到一个UI在多处 重复使用情况,那么就需要通过自定义View的方式 ...

最新文章

  1. 向线程传递数据与线程用回调方法检索数据
  2. 1、MySQL存储过程是什么?
  3. 一代不如一代?别轻易给年轻人贴标签
  4. 队列同步器 AbstractQueuedSynchronizer
  5. 怎么转化大小写_亚马逊search term被限制,Search Terms只能写一行怎么办?
  6. 零基础小白学习UI设计的4个步骤
  7. 沙发家具网站源码_小户型装修不会选家具?大湾网推荐你了解这些装修风格家具,装修省心空间大!...
  8. 使用强类型DataSet增加数据并获取自动增长的ID
  9. 安徽大学计算机基础知识答案,安徽大学大学计算机基础选择题
  10. 调和级数相关极限合集
  11. 超声波测距实现距离预警(米斯琪+开发板)
  12. 将IP地址转换为整数--将32位的二进制转换为十进制
  13. 倍数(Python)
  14. 八、STM32串口通信
  15. Golang开发入门
  16. 文本文件后缀修改为 .html
  17. 解读《创业家》2009年中国创新企业榜TOP100
  18. wireshark找不到接口?你的NPF没启动
  19. 东北大学校园网一键登录安卓实现
  20. 【Vue】9 - 组件(全局、局部)、通信(props、$meit、$refs)、插槽slot、component、$nextTick等

热门文章

  1. PowerDesigner生成建表脚本时字段超过15字符就发生错误
  2. Eclipse关闭无用validation
  3. 【2020模拟考试T4】【PAT乙】1034 有理数四则运算 (20分) 测试点2
  4. php mysqli查询实例,php mysqli查询语句返回值类型实例分析
  5. android控件的touch事件_聊聊Android嵌套滑动
  6. Python入门--__init__,__new__
  7. jquery内容选择器
  8. pycharm上python项目的导出_pycharm项目打包成exe
  9. python杨辉三角函数_Python算法之六:杨辉三角
  10. java Map及其实现类的底层原理