Android中在SurfaceView上高效绘图
来源:互联网 发布:淘宝定制服装价格 编辑:程序博客网 时间:2024/05/01 22:57
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=(CalendarView)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>
- Android中在SurfaceView上高效绘图
- Android中在SurfaceView上高效绘图
- Android中在SurfaceView上高效绘图
- 【android 使用两个surfaceview 在摄像机画面上绘图】
- android 在surfaceView上画图
- Android SurfaceView绘图机制
- Android---绘图机制---SurfaceView
- Android SurfaceView 多线程绘图
- android 绘图之surfaceview
- android获得在SurfaceView上滑动距离
- 【Android】在SurfaceView上显示透明图片
- Android中View,SurfaceView和GLSurfaceView绘图的区别
- Android中View,SurfaceView和GLSurfaceView绘图的区别
- Android SurfaceView onDraw()绘图问题
- Android SurfaceView双缓冲绘图
- Android SurfaceView双缓冲绘图
- Android 在AChartEngine上再绘图
- android 在Bitmap上进行绘图操作
- Android 完整地操作数据库--日记本实例
- sencha结合phonegap在ios上的教程
- 关于gmtime、gmtime_r、localtime、localtime_r
- C++多字节与宽字节间的转换(wchar_t与char转换)
- Android开发中的drawable-(hdpi,mdpi,ldpi)和WVGA,HVGA,QVGA的区别以及联系
- Android中在SurfaceView上高效绘图
- (Extjs)GridPanel中不允许选择某行或不允许取消某行修改
- 300个jQuery插件
- Android 记忆卡片游戏 记忆力 Android游戏 Android记忆卡片游戏源代码
- android 升级流程分析
- extend Thread 和 implements Runnable
- 彻底搞定 C 指针(完全版·修订增补版)
- (转)构建交叉编译器的工具—Ptxdist
- VIRTUAL