有这样一种view类,可以让人在其上面画动画,画图片,它的全名叫做surfaceview。名称就包含两层意思,一层是surface,一层是view。前一层提供一个面可以让人画画,后一层是个view,可以将画画显示出来。

一般view类也有个draw方法,但是不能用来画画。上网找了很多资料,说的啰嗦,都没有说明白。我总结了下,其实网上说的意思是,主线程,也就是跑activity活动的线程,它要先在界面把几个view显示出来(也就是绘出来),而且是后,然后与用户交互。如果在几个普通view画画的话,如果画画时间很长的话,你想,activity就一直在画画,都不理用户的,谁吃得消,所以就出现surfaceView。这个玩意儿就是activity用一个holder来控制,activity一边与用户交互,一边用holder在上面画画,两者都不耽误。

引用网上一句话:

SurfaceView它用于显示,SurfaceHolder就是用于用来管理这个显示的SurfaceView对象的,但在SurfaceHolder是怎么样去管理这个对象的呢?这就用到了SurfceHolder.addCallback()方法添加一个SurfaceHolder接口的内部接口的三个抽象方法用于管理或者说是用于监听SurfaceView。这样就达到了管理SurfaceView的目的。

主文件

package cn.com.sxp;

import android.app.Activity;
import android.os.Bundle;

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

sv =(cn.com.sxp.sxpView)findViewById(R.id.sxpView);
}
}

以前用自带的控件用多了,都习惯写上(Button)find....其实也可以自己定义控件,将xml文件布局控件与程序控件联系起来,只是要写上自定义控件的全路径。

surfaceView文件

package cn.com.sxp;

import java.util.Vector;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class sxpView extends SurfaceView implements SurfaceHolder.Callback {
// 实现SurfaceHolder.Callback接口,到时候surfaceView被创建、销毁什么的,都会调用这个接口的回调方法.
// A client may implement this interface to receive information about changes to the surface. When used with a SurfaceView, the Surface being held is only
// available between calls to surfaceCreated(SurfaceHolder) and surfaceDestroyed(SurfaceHolder). The Callback is set with SurfaceHolder.addCallback method.
// 每个surfaceView都要有surfaceHolder这么个组件,这个组件用来控制和访问surfaceView
private SurfaceHolder sh = null; // 专门用于控制surfaceView的
private Vector<Float> xAxis = new Vector<Float>();
private Vector<Float> yAxis = new Vector<Float>();

// XML文件解析需要调用View的构造函数View(Context , AttributeSet)因此自定义SurfaceView中也需要该构造函数
public sxpView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
// 是surfaceView的一个方法. Return the SurfaceHolder providing access and control over this SurfaceView's underlying surface.
sh = getHolder();
// Add a Callback interface for this holder. There can several Callback interfaces associated with a holder.
// addCallback方法就是指定了surfaceChanged等方法称为回调函数; 而所谓的实现SurfaceHolder.Callback接口就是让你实现surfaceChanged等接口
sh.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 sxpLoop()).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.GRAY);// 这里是绘制背景
Paint p = new Paint(); // 笔触
p.setAntiAlias(true); // 反锯齿
p.setColor(Color.BLUE);
p.setStyle(Style.STROKE);
for (int i = 0; i < xAxis.size(); i++)
canvas.drawCircle(xAxis.elementAt(i), yAxis.elementAt(i), 10, p);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
// Implement this method to handle touch screen motion events.
if (event.getAction() == MotionEvent.ACTION_DOWN) {
xAxis.add(event.getX());
yAxis.add(event.getY());
}
return true;
}

class sxpLoop implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
// 在绘图时,必须首先用Canvas c=holder.lockCanvas();锁定并获得画布,随后进行绘制,再调用holder.unlockCanvasAndPost(c);将绘制内容进行呈现
Canvas c = sh.lockCanvas();
doDraw(c);
sh.unlockCanvasAndPost(c);
Thread.sleep(20);
} catch (Exception e) {

}
}
}
}

}

自定义的控件必须要继承surfaceView类,同时实现surfaceHolder.Callback接口。surfaceView就是通过这个接口来控制的,什么接口,就是类似于onCreated...等。代码中还有个addCallback(this),就是增加这个自定义类作为参数,学术上叫做添加接口,个人呢理解就是onCreated...几个接口在自定义类中实现,所以就添加这个类作为参数了。

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 这种用法应该学习,布局中摆放的是控件,也可以摆放我自定义的控件. 但是我要指明我的控件的包名与空间名. 系统自带的控件不需要指定包名 -->
<cn.com.sxp.sxpView
android:id="@+id/sxpView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

</LinearLayout>

布局文件中不但可以用自带控件,还可以使用自定义控件,那叫一个爽~~~

运行结果

android_SurfaceView 画图的更多相关文章

  1. Ubuntu 16.10 安装KolourPaint 4画图工具

    KolourPaint 4画图工具简单实用,可以绘画.视频处理和图标编辑: • 绘画:绘制图表和“手绘” • 视频处理:编辑截图和照片;应用特效 • 图标编辑:绘画剪贴和标识透明化 1.在Ubuntu ...

  2. Android开发之画图的实现

    Android开发之画图的实现    四天前上完安卓的第一节课,真的是一脸懵逼,尽管熊哥说和java是差不多的,然而这个包和那个包之间的那些转换都是些什么鬼呀!!!但是四天的学习和操作下来,我觉得安卓 ...

  3. matlab画图函数plot()/set/legend

    简单plot()/legend/XY轴范围axis 除了坐标轴信息外还可以添加其它的信息,如所画曲线的信息等:测试代码如下 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); ...

  4. 对Raphael画图标的一个jquery简单封装

    公司要做一个项目的demo,要求地图上可以插红旗,所以就用到了Raphael. 因为是个demo,所以地图就用了一张图片,效果如下: 所以为了更好的封装一下这个功能,就写了一个简单的插件:jquery ...

  5. java画图之曲线拖动

    目标:在窗体上按下鼠标按键.然后拖动鼠标,在按下和拖动之间绘制曲线 事件机制 事件源对象:窗体 事件监听方法:addMouseListener(MouseListener l);addMouseMot ...

  6. java画图之初体验

    1.实现画图程序所需的API类 JFrame JButton ActionListener              动作事件接口 ActionEvent                        ...

  7. 【JavaScript】操作Canvas画图

    1.页面添加 Canvas 标签 标签内可以写文字,浏览器不支持Canvas的情况下显示, 2.js获取 Canvas 标签 3.利用js函数画图,[线][图][文字] 源:http://www.li ...

  8. 用Canvas制作简单的画图工具

    今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1 ...

  9. html5之canvas画图基础

    HTML5+CSS3的好处是,你可以编写一个页面分别用于不同的平台,只需要设置不同的css样式就可以了,现在基本主流浏览器都支持全新的HTML5和CSS3,因为它的跨平台开发.因为是原生代码所以它的页 ...

随机推荐

  1. websocket协议学习

    一 实验代码 client.html websocket_server.go package main import ( "crypto/sha1" "encoding/ ...

  2. Editor.md v1.4.2 发布,改进自定义工具栏

    分享 <关于我> 分享  [中文纪录片]互联网时代                 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...

  3. QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)

    简述 对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态.而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结. 分为下面六种不同情况 客户端网线断开 客户端网 ...

  4. kubernetes之使用http rest api访问集群

    系列目录 在Kubernetes集群中,API Server是集群管理API的入口,由运行在Master节点上的一个名为kube-apiserver的进程提供的服务. 用户进入API可以通过kubec ...

  5. WebApp 安全风险与防护课堂(第二讲)开课了!

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl ...

  6. HBase —— 集群环境搭建

    一.集群规划 这里搭建一个3节点的HBase集群,其中三台主机上均为Regin Server.同时为了保证高可用,除了在hadoop001上部署主Master服务外,还在hadoop002上部署备用的 ...

  7. 【IDE】idea在debug模式启动非常慢,debug模式一直在启动中状态

    现象:一直处于启动中状态,日志刷的很慢,非debug模式正常启动: 最终解决方式:下图按钮,取消所有打过的断点,问题解决

  8. maven_nexus私服搭建

    搭建很简单,但是新版本运行方式有所区别,于此记录一下: 1.下载程序包:http://www.sonatype.org/nexus/downloads/ 官网比较慢,下了一小时.期间在csdn花了一积 ...

  9. yii框架widget和注册asset的例子

    yii框架是一个基于组件的框架,这样代码的重用性就非常的高,如我们想在网站的多个地方调用编辑器,这样我们就可以自定义一个组件,来供我们调用使用 下面以Ueditor组件为例: 1.下载ueditor到 ...

  10. Matplotlib快速入门

    Matplotlib 可能还有小伙伴不知道Matplotlib是什么,下面是维基百科的介绍. Matplotlib 是Python编程语言的一个绘图库及其数值数学扩展 NumPy.它为利用通用的图形用 ...