android_SurfaceView 画图
有这样一种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 画图的更多相关文章
- Ubuntu 16.10 安装KolourPaint 4画图工具
KolourPaint 4画图工具简单实用,可以绘画.视频处理和图标编辑: • 绘画:绘制图表和“手绘” • 视频处理:编辑截图和照片;应用特效 • 图标编辑:绘画剪贴和标识透明化 1.在Ubuntu ...
- Android开发之画图的实现
Android开发之画图的实现 四天前上完安卓的第一节课,真的是一脸懵逼,尽管熊哥说和java是差不多的,然而这个包和那个包之间的那些转换都是些什么鬼呀!!!但是四天的学习和操作下来,我觉得安卓 ...
- matlab画图函数plot()/set/legend
简单plot()/legend/XY轴范围axis 除了坐标轴信息外还可以添加其它的信息,如所画曲线的信息等:测试代码如下 x=0:pi/20:2*pi; y1=sin(x); y2=cos(x); ...
- 对Raphael画图标的一个jquery简单封装
公司要做一个项目的demo,要求地图上可以插红旗,所以就用到了Raphael. 因为是个demo,所以地图就用了一张图片,效果如下: 所以为了更好的封装一下这个功能,就写了一个简单的插件:jquery ...
- java画图之曲线拖动
目标:在窗体上按下鼠标按键.然后拖动鼠标,在按下和拖动之间绘制曲线 事件机制 事件源对象:窗体 事件监听方法:addMouseListener(MouseListener l);addMouseMot ...
- java画图之初体验
1.实现画图程序所需的API类 JFrame JButton ActionListener 动作事件接口 ActionEvent ...
- 【JavaScript】操作Canvas画图
1.页面添加 Canvas 标签 标签内可以写文字,浏览器不支持Canvas的情况下显示, 2.js获取 Canvas 标签 3.利用js函数画图,[线][图][文字] 源:http://www.li ...
- 用Canvas制作简单的画图工具
今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1 ...
- html5之canvas画图基础
HTML5+CSS3的好处是,你可以编写一个页面分别用于不同的平台,只需要设置不同的css样式就可以了,现在基本主流浏览器都支持全新的HTML5和CSS3,因为它的跨平台开发.因为是原生代码所以它的页 ...
随机推荐
- TThreadList Demo
type TForm1 = class(TForm) Button1: TButton; Button3: TButton; ListBox1: TListBox; Button2: TButton; ...
- 获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- 关于SetLength报Out of memory的研究及解决办法
关于SetLength报Out of memory的研究及解决办法 最近在做一个GIS系统, 在读GIS数据时采用了动态数组,突然读一个数据时SetLength报错!Out of memory 仔细研 ...
- Use Spring @Scheduled To Achieve Timing Task
Today I have a chance to use the @Scheduled to achieve a timing task.It is useful.Anyway,it was the ...
- Android自定义View入门(一)
最近在写一个关于音乐播放的应用,写到播放界面UI时,就想自己实现的一个播放界面.那么如何实现自定义View呢?通过查看他人博客和Android官方开发文档,初步了解了一些浅显的内容.在此记录,已供需要 ...
- UWP入门(五)--控件模板
原文:UWP入门(五)--控件模板 通过在 XAML 框架中创建控件模板,你可以自定义控件的可视结构和可视行为(eg:勾选框的三种状态). 控件有多个属性,如 Background.Foregroun ...
- Android零基础入门第69节:ViewPager快速实现引导页
在很多APP第一次启动时都会出现引导页,在一些APP里面还会包括一些左右滑动翻页和页面轮播切换的情况.在之前也已经学习了AdapterViewFlipper和ViewFlipper,都可以很好的实现, ...
- Delphi-网络编程-第一个网络方面作品(UDP聊天程序)
其实这不算是一个聊天程序,因为还不能实现双方互发信息,只有一方能发信息,呵呵 我以后再改进吧.... 服务端代码: unit Unit1; interface uses Windows, ...
- GetLastError()返回值列表(3259个错误列表)
GetLastError()返回值列表: [0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [ ...
- 【DRP】-完成物料修改页面Servlet和JSP开发
本系列博客内容为:做DRP系统中的常用功能. 该项目采用MVC架构 C(Controller)控制器,主要职责;1.取得表单参数:2.调用业务逻辑:3.转向页面 M(Model)模型,主要职责:1.业 ...