android中SurfaceView组件使用解析

SurfaceView组件可以实现高效率的绘制二维图或者显示图像,在游戏开发中经常用到。在android中,已经提供了SurfaceView组件。使用时,一般是通过继承的方法实现自定义surfaceView,也可以在MainActivity中通过接口surfaceHolder.callback接口实现,这里介绍通过接口实现surfaceView绘图,当然,绘图可以是静态图(在指定区域只绘制一次),也可以是动态图(指定区域-->绘制-->再循环)。

SurfaceView组件的使用流程:通过findViewById()实例化SurfaceView组件,得到实例化对象;利用getHolder()方法得到SurfaceViewHolder类对象,为该对象添加callBack(Context context)回调;在surfaceCreate()方法中添加surfaceView刚显示的初始化代码,这个方法在实例化SurfaceView组件时执行,比如可以初始化背景颜色,绘图区显示出的形状、坐标等;surfaceChanged()方法主要是在surfaceView对象大小、形状改变时调用;surfaceDestroyed()方法是在surfaceView销毁时调用,一般是添加kill代码。

在SurfaceView组件显示区域上,实现绘制二维图形需要三个类:Paint、Canvas和SurfaceHolder类。其中Paint类指的是画笔,可以设置画笔的颜色(类似于红笔芯还是蓝笔芯),画笔显示的线宽(类似于0.35mm还是0.5mm)等;Canvas类相当于画布,它通过SurfaceHolder类中的lockCanvas()方法获得,这个lockCanvas()方法可以带有参数,用来指定锁定画布的区域(也就是说,画布锁定的区域不一定是surfaceView定义的全部区域,也可以是参数指定的部分区域),当锁定了区域之后,就可以通过Canvas类实例对象所提供的方法来绘制点、线、圆、矩形、图像等,这些方法中的参数一般会有Paint类对象。

需要注意的一点是,在锁定画布区域进行绘制图形或者图像的代码,一般是开一个独立线程进行的,这个线程可以在surfaceCreate()方法中开启。

唉,图片加不上去,只能贴代码了。

package com.main.dfa_surfaceview;
 
import android.support.v7.app.ActionBarActivity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback {
    Button btn1=null;
    SurfaceView sfc=null;
    SurfaceHolder holder=null;
    Paint paint_one=null;
    Paint paint_two=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        
        btn1=(Button)findViewById(R.id.btn1);
        sfc=(SurfaceView)findViewById(R.id.surfaceView1);
        holder=sfc.getHolder(); //得到surfaceView的holder,类似于surfaceView的控制器
        holder.addCallback(this);
        
        paint_one=new Paint(); //获取画笔实例
        paint_two=new Paint();
        paint_one.setColor(Color.BLUE); //画笔颜色
        paint_two.setColor(Color.GREEN);
        paint_one.setStrokeWidth(20); //设置线宽
        paint_two.setStrokeWidth(10); 
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "asdgdsgas", Toast.LENGTH_SHORT).show();
                MyThread mthread=new MyThread();
                mthread.start();
            }
        });       
    }
    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        
    }
    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        //当surfaceView创建的时候执行
        init_background();//初始化绘图界面
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub
        
    }
    
    private void init_background(){
        Canvas canvas=null;
        canvas=holder.lockCanvas();//获取目标画图区域
        canvas.drawColor(Color.RED);//画布背景颜色   
        holder.unlockCanvasAndPost(canvas); //解除锁定并显示 
    } 
    
    private class MyThread extends Thread{
        
        public void run(){
            Canvas canvas=null;
            canvas=holder.lockCanvas();//获取目标画图区域,无参数表示锁定的是全部绘图区
            canvas.drawColor(Color.RED);//画布背景颜色设置
            canvas.drawCircle(100, 100, 50, paint_one);//以(100,100)为圆心,画一个半径为50像素的圆
            canvas.drawCircle(50, 50, 50, paint_two);
            holder.unlockCanvasAndPost(canvas); //解除锁定并显示 
        }   
    }
}
时间: 2024-10-01 05:26:54

android中SurfaceView组件使用解析的相关文章

Android中Intent组件详解

Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作.与动作有关的数据等.Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android的媒婆任务就完成了. 在Google Doc中是这样描述Intent的(摘自Android中文翻译组)当接收到ContentR

【转】 Android中Intent组件详解

原帖地址 http://blog.csdn.net/zuolongsnail/article/details/6574211 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作.与动作有关的数据等.Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android

Android中BroadcastReceiver组件具体解释

Android系统的4个组件最终还剩一种组件了BroadcastReceiver,这个组件是全局监听器,能够监听系统全局的广播消息,能够方便的实现系统中不同组件之间的通信 BroadcastReceiver有自己的进程,系统级监听器,仅仅要存在与之匹配的Intent被广播出来,BroadcastReceiver就会被激发 要创建自己的BroadcastReceiver对象,我们须要继承android.content.BroadcastReceiver,并实现其onReceive方法 MyRece

进阶篇-用户界面:4.Android中常用组件

1.下拉菜单 在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可.这是在Web开发中一个必不可少的交互性组件,而在Android中的对应实现就是Spinner. 方法一: 以资源方式,静态展示 Spinner 选项: <Spinner android:layout_width="match_parent" android:layout_height="wra

Android中自定义组件和它的属性

好长时间没有更新博客了,本来想积累点有深度的东西发,但一直没有找到很好的点.所以,写一些基础的东西,就当积累吧. Android开发中难免会用到自定义的组件,下面以ImageButton为例来介绍怎么自定义组件和它的属性: 第一步.在values/attrs.xml中为组件自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name=&

(二十八) Android中ViewStub组件使用(转载自:http://blog.csdn.net/mayingcai1987/article/details/6238609)

1. 概述: ViewStub组件和<include>标签的作用类似,主要是为了提高布局的重用性,及布局的模块化.它们之间最大的差别是,ViewStub中的布局不会随着它所在布局的渲染而渲染,而<include>标签中的布局会随着它所在布局的渲染而渲染,ViewStub中的布局只有在你需要的时候才会渲染到主界面中. 2. 效果图: (1)在ButtonOne与ButtonTwo之间存在一个ViewStub布局,如下图: (2)单击ButtonOne后渲染ViewStub中的布局,如

android中使用JSOUP如何解析网页数据详述

最近使用了Jsoup,感觉还是挺简单,挺方便的,轻而易举地抓取网页源码,分析获取各个标签所需的东西. 这几天在搞一个音乐播放器的小项目,其中使用到了就是使用JSOUP进行页面数据的获取,获取网页的歌曲列表,并对歌曲的链接进行加载,以便实现歌曲下载和歌词的下载.搞好之后,就会跟着写几篇博文,分享给大家.本博文主要说明android中使用jsoup如何进行网页数据的获取. 具体可看下面各个相关例子: Jsoup下载地址: http://jsoup.org/download jsoup开发指南,jso

Android笔记(六) Android中的组件

一个软件可以吸引到用户,除了优秀的功能可以解决用户的问题之外,良好的用户界面也并不可少.一个软件的功能不管多么优秀,但是没有提供友好的界面来让用户操作,将很难吸引到最终用户. Android提供了大量的UI组件,开发者按照一定规律把这些UI组件组合在一起,形成一个优秀的图形用户界面,再通过Android提供的事件响应机制,让这些组件可以响应用户的点击.拖动,最终完成用户的交互操作. Android应用的绝大部分UI组件都放在android.widget包及其子包.android.view包机器子

Android中复用问题哲理性解析

Android中列表的复用机制提高了APP的运行效率,但随之而来的复用的问题总是让程序员们头痛,一个 bug找头天也找不到.我就把自己解决这方面的经验贡献出来供大家参考: 问题1:什么是复用 复用其实指的是复用View,而绑定View的数据是变化的. 问题2:复用出现的场景 在Adapter中,如果绑定View的数据的时候如果有if判断,往往很多人忘记了加else,这是大多数复用问题出现的根源. 实际场景:     比如每个item可能有或没有图片picarrList,之前我只加了if判断,如果