Android的SurfaceView使用

[Android] SurfaceView使用实例 同样,先上效果图如下: 效果图中,抛物线的动画即是由SurfaceView实现的。底部栏中的文字翻转详情相关帖子: [Android] 文字翻转动画的实现 需求: 1.实现抛物线动画    1.1 设计物理模型,能够根据时间变量计算出某个时刻图片的X/Y坐标。    1.2 将图片高频率(相比于UI线程的缓慢而言)刷新到界面中。这儿需要实现将脏界面清屏及刷新操作。 2 阅读详情

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

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

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

了,添加类似的布局代码:
    <com.android.sv.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);将绘制内容进行呈现

下面是个例子运行图:


主界面:

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
	private MyView mSV=null;
	private Button mBtnOk;
	private Button mBtnCancle;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mSV=(MyView)findViewById(R.id.sv);
        mSV.setTag(true);
        mBtnOk=(Button)findViewById(R.id.btnok);
        mBtnOk.setOnClickListener(new OnClickListener() {
			
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mSV.setTag(true);
			}
		});
        
        mBtnCancle=(Button)findViewById(R.id.btnCancel);
        mBtnCancle.setOnClickListener(new OnClickListener() {
			
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mSV.setTag(false);
			}
		});
    }
}

MyTest界面:

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 attrs) {
		super(context, attrs);
		holder=getHolder();
	    holder.addCallback(this);
	}

	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub
		
	}

	public void surfaceCreated(SurfaceHolder arg0) {
		// TODO Auto-generated method stub
		new Thread(new MyLoop()).start();//在 View 中系统不允许主线程外的线程控制 UI .但是 SurfaceView 却可以
	}

	public void surfaceDestroyed(SurfaceHolder arg0) {
		// 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);
		   int a=xs.size();
		   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){
		   String a=this.getTag().toString();
		    if(a.equals("true")){
		    	 xs.add(event.getX());
		 	     ys.add(event.getY());
		    }
	   }
	   return true;
	}
	
	class MyLoop implements Runnable{
		//熟悉游戏编程的应该很面熟吧,主循环
		   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.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <com.android.sv.MyView
    android:id="@+id/sv"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
    <Button android:id="@+id/btnok"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="开启绘图"/>
    <Button android:id="@+id/btnCancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/btnok"
            android:text="取消绘图"/>  
</RelativeLayout>





Android学习之界面篇(九)SurfaceView简单学习 知识点: surfaceview介绍surfaceview与View的区别,surface与surfaceview的区别实例创建与使用SurfaceHolder.Callback的使用,surfaceHolder可以看作是surfaceview的控制器,控制图形的大小,像素等.在主函数中回调函数的使用getHolder.addCallback(this)canvas的锁定与解锁,绘制图形之前 阅读详情

相关推荐

Android中的SurfaceView

是 Android 中用于动态图像显示的高效组件,它通过Surface和提供了一种简单而强大的方法来在屏幕上绘制图像。理解的工作原理对于开发涉及视频播放、游戏渲染或相机预览的 Android 应用非常重要。

bai915290475的博客 1290

关于surfaceview构造器的理解

如果你的activity显示内容就只是一个surfaceview的话,那么你只重写public mysurfaceview(Context context)就可以,然后在activity的oncreate方法中使用类似于下面的代码加载: setContentView(new MySurfaceView(this)); 如果你的SurfaceView是放在一个xml布局文件中比如main.x

芬芳de野百合 1188

Android SurfaceView的基本使用

一、为什么要SurfaceView 大多数情况下我们的自定义View都会选择去继承View或ViewGroup来实现,但是为什么系统还要为我们提供一个SurfaceView呢? 首先我们知道View类如果需要更新视图,必须我们主动的去调用invalidate()或者postInvalidate()方法来再走一次onDraw()完成更新。但是呢,Android系统规定屏幕的刷新间隔为16ms,如果这个View在16ms内更新完毕了,就不会卡顿,但是如果逻辑操作太多,16ms内没有更新完毕,剩下的操作就会丢到

liangtianmeng的专栏 975

SurfaceView的那点事儿

View之孪生兄弟-SurfaceView概述Android系统中提供了View进行绘图处理,View可以满足大部分的绘图需求,但是在某些时候却力不从心,特别是进行一些开发的时候。一般的View通过刷新来重绘视图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新的时间间隔是16ms。如果在16ms内View完成了所需要执行的操作,那么用户在视觉上就不会产生卡顿的感觉;而如果执行的逻辑太

小工匠 2万+

Android中SurfaceView使用详解

绘制的时候,在surfaceCreated()方法中开启子线程进行绘制,而子线程使用一个while(mIsDrawing)的循环来不停的进行绘制,在绘制的逻辑中通过lockCanvas()方法获取Canvas对象进行绘制,通过unlockCanvasAndPost(mCanvas)方法对画布内容进行提交。在我们的draw()方法每一次更新所耗费的时间是不确定的。在自定义的MySurfaceView的构造方法中,需要对SurfaceView进行初始化,包括SurfaceHolder的初始化、画笔的初始化等。

2401_89693823的博客 1652

Android SurfaceView总结及代码示例

#一.概述 SurfaceView与普通View不同,View树上的普通View共享一个Surface,而SurfaceView拥有单独的Surface。 而且普通View必须在UI线程中绘制,而SurfaceView可以在非UI线程中完成绘制工作,不占用UI主线程。 SurfaceView可以通过SurfaceHolder获取其Surface的尺寸和状态变化,并通过SurfaceHolder控制在Surface上的控制流程。 从Android 1.0...

u013914309的博客 1737

安卓surfaceview的使用方式

surfaceview内部机制和外部层次结构在安卓开发中,我们经常会遇到一些需要高性能、高帧率、高画质的应用场景,例如视频播放、游戏开发、相机预览等。这些场景中,我们需要直接操作图像数据,并且实时地显示到屏幕上。view组件是在主线程中进行绘制的,如果绘制过程耗时过长或者频繁刷新,可能会导致主线程阻塞,影响用户交互和界面响应。view组件在绘制时没有使用双缓冲机制,也就是说每次绘制都是直接在屏幕上进行的,这可能会导致绘制过程中出现闪烁或者撕裂的现象。

Makenna's World 5518

Android之SurfaceView使用总结

1.概念 SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。 2.实现方法 1)实现步骤 a.继承Surfa...

人生代码 ---- 公众号 1727

安卓SurfaceView截屏

关于安卓SurfaceView截屏 2015.12.9号是一个值得记得日子,开始拖着背包从学校出来,挤上火车,做着接近30小时的硬座,来到了美丽的成都,那时候赵雷的还没火,‘走到玉林路的尽头 坐在小酒馆的门口 ‘,多么诗情画意的生活啊。来不及享受这安逸之都的生活,便匆匆的开始实习生涯。 时至今日,也已经毕业大半年了,也从实习生正式成了职场人。身边大神很多,公司也是藏龙卧虎,也感觉应该养成

阿文的博客 1万+

AD在建PCB封装时如何添加元器件的3D模型

3D模型

k1ang的博客 1万+

Python爬虫实战:用Selenium+ChromeDriver批量抓取政府网站政策文件(附完整代码)

本文详细介绍了使用Python的Selenium和ChromeDriver进行政府网站政策文件批量抓取的实战技巧。从环境配置、动态页面元素定位到分页机制破解和反爬虫策略,提供了完整的解决方案和代码示例,帮助开发者高效获取结构化政策数据。

weixin_42531710的博客 266

android surfaceview bitmap,Android使用SurfaceView绘制静态图像

使用 SurfaceView 绘图需要为 SurfaceView 对象添加 SurfaceHoloder.Callback 接口,并在该接口的 surfaceCreated() 方法中通过 lockCanvas() 方法获取 Canvas 对象,以此保证当获取 Canvas 时,SurfaceView 对象可用。当绘图工作完成后,通过 SurfaceHoloder.unlockCanvas-And...

weixin_30382087的博客 1668

MAX31856高精度热电偶测温系统实战:从寄存器配置到温度读取

本文详细介绍了MAX31856高精度热电偶测温系统的实战应用。从硬件连接避坑、核心寄存器配置(如CR0、CR1),到利用中断高效读取并解析温度数据,提供了完整的驱动框架和代码示例。该方案解决了传统热电偶信号微弱、非线性及冷端补偿难题,适用于工业测温等场景,帮助开发者快速实现稳定可靠的高精度温度测量。

coffee的博客 486

android安卓SurfaceView与view的区别是什么?

原贴: link 原贴: link surfaceView和View最本质的区别在于: surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中

ruiruiddd的博客 1636

中文实体关系抽取数据集大盘点:从百度Duie2.0到医疗CBLUE,哪个更适合你的NLP项目?

本文全面分析了中文实体关系抽取领域的主流数据集,包括百度DuIE 2.0、医疗CBLUE等,帮助开发者根据项目需求选择最适合的数据集。文章详细对比了各数据集的特点、适用场景及优化策略,为自然语言处理项目提供实用指南。

weixin_29284657的博客 121

C# ScottPlot 5.0 WinForms 十字光标示例:轻松实现动态数值显示,你学会了吗?

ScottPlot是一个免费、开源的.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。它支持多种图表类型,如折线图、柱状图、饼图、散点图等。ScottPlot的性能非常出色,即使是处理千万级别的数据也游刃有余。

java专栏 2218

安卓(Android)surfaceview无法使用gesturedetector的解决办法

因为课程项目里用到了surfaceview并且需要在上面响应安卓的手势

Craigm的专栏 1726

【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决

摘要:OpenClaw 运行出现"100% context used 309.9k/200k"报错,表示上下文窗口超出200k Token限制。解决方法包括:1) 重启服务或新建会话清空缓存;2) 修改配置文件提升context_window值;3) 长期优化如限制历史对话轮数、分批处理长文本。该问题通常由输入过长或多轮对话累积导致,需控制单次输入量在阈值内。

奶爸的编程之路,也就一周冷个三天 3236

Android SurfaceView 的使用

SurfaceView 的作用: SurfaceView 适用被动更新,如频繁的刷新,在子线程刷新不会阻塞主线程,适用于界面频繁更新 (View适用主动更新) SurfaceView可以控制刷新频率。 SurfaceView底层利用双缓存机制,绘图时不会出现闪烁问题。 SurfaceView 的使用方法: 一般都是view继承SurfaceView,实现SurfaceHolder.Callback接口 会自动生成3个方法如下 @Override public void surfaceC

小牧在一直在学习,在前进的道路上大家一起学习,进步。 4975

复数值神经网络可能是深度学习的未来

复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。

gongdiwudu的专栏 6617

跨 Agent 语义沟通机制构建:共享知识图谱与语义对齐方法

在具身智能与多智能体系统协同日益复杂化的背景下,跨 Agent 的语义沟通能力成为任务完成效率和系统鲁棒性提升的关键技术路径。本文系统分析了当前业界在共享知识图谱、语义嵌入对齐、语义意图建模与跨模态语义通信协议设计方面的实践经验,深入讲解如何在 Habitat-MARL 与 Isaac-MARL 等平台中,基于实体-关系结构、语义分布表示与任务上下文,构建具备理解、共享、协作能力的多 Agent 语义系统。文章以工程实战为主,覆盖图谱构建、语义嵌入同步、对齐模型部署、通信接口集成等多个核心模块,结合真实应用

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1293

android飞机大战功能,安卓飞机大战(二) SurfaceView实现自制背景

用SurfaceView写一个自制的背景图,并且可以移动,加上安卓飞机大战(一)中的BackgroundManager类,可以直接使用GameView代码:public class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable{private SurfaceHolder hd=null;private...

weixin_39851457的博客 469

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android SurfaceView隐藏显示问题

近日在搞一个直播项目,用SurfaceView显示直播远端画面,但是有一个需求就是加一个按钮,可以显示隐藏SurfaceView,上代码 布局很简单,我通过直播SDK拿到surfaceview以后,直接 此时surfaceview显示到画面中了,那如何隐藏呢? 按照常理出牌肯定童鞋会说box.setVisibility(INVISIBLE)就行了,但是此时设置之后你会发现surfaceview...

qq_36356379的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android开发——SurfaceView使用总结

0. 前言在Android开发中,如果需要在主线程之外的线程绘制界面、View需要频繁刷新或刷新时数据流较大时,就要考虑使用SurfaceView了。因为SurfaceView可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。1. SurfaceView和View的区别(1)View主要用于主动刷新的情况下,而SurfaceView多用于频繁地被动刷新。(2)View是在主...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 5730

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: android handler和thread的使用
下一篇: Android模拟器SD卡的使用
lanpy88
博客等级 码龄18年 54粉丝 21原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值