win10 apply image_surface(x,y,bullet_image,screen);这个函数有什么用,

类别: &贡献者: &总点击:1353 &受欢迎度:10
知识概况:
valati....
相关目录: >
收藏到: &
(提示:顶到域名网·中国首页,分享给更多人)&&
&&&用Google翻译此网页:
现在有0人对'Domain Names Registered on Oct 30_7,2008'发表评论
您的姓名:
* 可选项,留空即为匿名发表
评论内容:
剩余字数:& * 按 Ctrl + Enter 直接发送.
域名网·中国温馨提示:评论只需提交一次,请耐心等候,审核后方可显示.
精彩域名知识分享
域名知识大学堂
域名信息网米友推荐
&&&&&&&&&&
声明:本站为我们域名爱好者共同分享知识的平台,非域名注册机构.Android(12)
&在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制。又由于不会占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输入得不到及时响应。
SurfaceView也是继承View的,但是跟其他TextView,ImageView等就不一样;最大的不一样,SurfaceView并没有使用View的宿主窗口(下面我都管这个宿主窗口为顶级surface),它有自己独立的surface,绘制是在这个独立的surface上绘制。
而TextView,ImageView等同样也是继承View的子类,都是共用的一个surface,这个surface在ViewRootImpl创建,以lockCanvas()的形式返回canvas去管理绘制传递下去。
先从一个简单的demo讲起:
public class MySurfaceView extends SurfaceView implements Runnable, SurfaceHolder.Callback {
private SurfaceHolder mH // 用于控制SurfaceView
private T // 声明一条线程
// 线程运行的标识,用于控制线程
private Canvas mC // 声明一张画布
private P // 声明一支画笔
private int x = 50, y = 50, r = 10; // 圆的坐标和半径
public MySurfaceView(Context context) {
super(context);
mHolder = getHolder(); // 获得SurfaceHolder对象
mHolder.addCallback(this); // 为SurfaceView添加状态监听
p = new Paint(); // 创建一个画笔对象
p.setColor(Color.WHITE); // 设置画笔的颜色为白色
setFocusable(true); // 设置焦点
* 自定义一个方法,在画布上画一个圆
public void doDraw() {
mCanvas = mHolder.lockCanvas(); // 获得画布对象,开始对画布画画
mCanvas.drawRGB(0, 0, 0); // 把画布填充为黑色
mCanvas.drawCircle(x, y, r, p); // 画一个圆
mHolder.unlockCanvasAndPost(mCanvas); // 完成画画,把画布显示在屏幕上
* 当SurfaceView创建的时候,调用此函数
public void surfaceCreated(SurfaceHolder holder) {
t = new Thread(this); // 创建一个线程对象
flag = // 把线程运行的标识设置成true
t.start(); // 启动线程
* 当SurfaceView的视图发生改变的时候,调用此函数
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
* 当SurfaceView销毁的时候,调用此函数
public void surfaceDestroyed(SurfaceHolder holder) {
flag = // 把线程运行的标识设置成false
* 当屏幕被触摸时调用
public boolean onTouchEvent(MotionEvent event) {
x = (int) event.getX(); // 获得屏幕被触摸时对应的X轴坐标
y = (int) event.getY(); // 获得屏幕被触摸时对应的Y轴坐标
* 当用户按键时调用
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
//当用户点击↑键时
//设置Y轴坐标减1
return super.onKeyDown(keyCode, event);
public void run() {
while (flag) {
doDraw(); // 调用自定义画画方法
Thread.sleep(2000); // 让线程休息50毫秒
} catch (InterruptedException e) {
e.printStackTrace();
MySurfaceView:
1,继承SurfaceView父类和SurfaceHolder.Callback接口,并实现surfaceCreated(SurfaceHolder holder),surfaceChanged,surfaceDestroyed方法来管理surfaceview的生命周期。
2,构造方法中设置this为callback。
mHolder = getHolder(); // 获得SurfaceHolder对象
mHolder.addCallback(this); // 为SurfaceView添加状态监听 3,进行具体的主体绘制时需主动获取canvas,这是跟View不同的地方。
1,这里不知道你有没有注意到,我们在MySurfaceView的绘制里面开了个子线程。学过android肯定知道UI线程一定在主线程,而SurfaceView的绘制可以在子线程实现,这也正是SurfaceView的一大亮点。如此可以把一些耗时的渲染让在SurfaceView来绘制,就不会导致主线程阻塞。
可以使用子线程的原因(个人理解):android的主UI是在ViewRootImpl提供的surface,作为顶级surface是要一直呈现给用户的,所有的View都是在顶级Surface进行绘制的。而SurfaceView拥有自己独立的surface,由WindowManagerService完成绘制,并以在顶级surface上打洞的形式来呈现自己。
因为SurfaceView拥有独立的surface,最好的实现应该是要放在独立的线程来绘制。
这里有几个类必须要详细讲一下:Surface,SurfaceHolder ,SurfaceHolder.Callback
surface对应着一个layer,是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理的。我们可以理解surface就是一段最终用来显示的内存。每个SurfaceView都有一个独立的surface。
而View并不持有独立的surface,view持有的是一个顶级surface通过lockCanvas(Rect dirty)指定的部分区域,并通过canvas来绘制这部分区域。这个顶级surface也对应着一个layer。SurfaceView的surface是通过在顶级surface下打洞的形式来呈现自己。
最终,这些surface会被surfaceFlinger来合成并最终显示出来。
Surface是实现了Parcelable接口的,所以可以实现跨进程传输surface。事实上,surface的刷新都在updateWindow()中具体实现。
updateWindow()中:
IWindowSession mS
relayoutResult = mSession.relayout(
mWindow, mWindow.mSeq, mLayout, mWidth, mHeight,
visible ? VISIBLE : GONE,
WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY,
mWinFrame, mOverscanInsets, mContentInsets,
mVisibleInsets, mStableInsets, mConfiguration, mNewSurface);
IWindowSession.aidl
int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs,
int requestedWidth, int requestedHeight, int viewVisibility,
int flags, out Rect outFrame, out Rect outOverscanInsets,
out Rect outContentInsets, out Rect outVisibleInsets,
out Configuration outConfig, out Surface outSurface);
这里希望读者可以区分aidl的标识符in和out的区别。
在SurfaceView中输入的参数mWindow,mWindow.mSeq,mLayout等,输出的参数有outFrame,outConfig,outSurface等。
很明显,这里是把SurfaceView中的一些LayoutParams布局属性值传递给了mSession,而mSession又调用WindowManagerService的relayoutWindow()来完成重绘过程,并将新的outSurface返回给SurfaceView的mNewSurface。
mSurface.transferFrom(mNewSurface);
在updateWindow()中通过transferFrom()即可把新的surface赋值给mSurface。
SurfaceHolder
SurfaceHolder的主要作用:
1,getSurface(),对surface的持有和管理
2,lockCanvas(),unlockCanvasAndPost(),对canvas的创建和释放
3,addCallback(),removeCallback(),对实现SurfaceHolder.Callback的MySurfaceView子类注册管理。
4,通过调用surfaceholder的setFixedSize、setSizeFromLayout、setFormat都会触发重绘surface得到新的surface。
1,这里的lockCanvas()和lockCanvas(Rect dirty)的区别,dirty指向一个指定的重绘区域,区域之外部分不重绘,如此可提高绘制效率。
SurfaceHolder.Callback
SurfaceHolder.Callback管理Surface的生命周期,并监听surface的变化。在surface状态发生变化的时候通知SurfaceView,触发updateWindow(),进而触发了callback的三个方法,并把新的surfaceholder输出。
SurfaceHolder.Callback具有如下的接口:
surfaceCreated(SurfaceHolder holder):
当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。&
surfaceChanged(SurfaceHolder holder, int format, int width,int height):
当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。&
surfaceDestroyed(SurfaceHolder holder):
当Surface被摧毁前会调用该函数,该函数被调用后就不能继续使用Surface了,一般在该函数中来清理使用的资源。&
使用SurfaceView
只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了,
SurfaceView和View的比较
1,SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
2,View是通过ViewRootImpl提供的顶级surface进行lockCanvas(Rect dirty),返回的canvas会在指定的dirty范围进行绘制。
而每一个SurfaceView拥有独立的surface,通过在顶级surface上打洞来显示自己。这些surface对应底层的Layer,由SurfaceFlinger根据这些layer的内容以及层级进行混合并最终显示。
The surface is Z ordered so that it is behind the window holding its&SurfaceV the SurfaceView punches a hole in its window to allow its&surface to be displayed.&
3,SurfaceView通过SurfaceHolder.mSurface直接在ViewRootImpl获得surface。
4,在使用上SurfaceView需通过SurfaceHolder.lockCanvas()主动获取canvas。而View是直接由顶级surface在ViewRootImple就已经lockCanvas后,把canvas传递到View的draw(canvas)。
5,因为View是只拥有一个顶级surface,子view都是共用一个surface,所以在绘制时performTraversals()是对一个树结构的view群进行测量、布局、绘制的遍历。
而一个SurfaceView拥有一个surface,它只需要对自己进行测量、布局和绘制。流程简单的多。
6,SurfaceView实现重绘的方式更直观,每次主动调用doDraw()(ps:我上面自定义的方法)就是重新绘制。而View因为不能直接通过surface.lockCanvas获取canvas,只能通过调用invalidate()去触发父视图ViewRootImpl去调用performTraversal()去实现重绘。总之重绘实现就是在 surface上lockCanas(Rect dirty)得到的部分是可以重绘部分。
SurfaceView和View的使用场景
1 ,被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
2 ,主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
Surface和Canvas的区别
surface就可以这样理解:它是内存中一块区域,它是surfaceview可见的那个部分,绘图操作作用于它,然后它就会被显卡之类的显示控制器绘制到屏幕上。大家都知道,内存区的对象是有生命周期的,可以动态的申请创建和销毁,当然也可能会更新。于是,就有了作用于这个内存区的操作,这些操作就是surfaceCreated/Changed/Destroyed。三个操作放在一起,就是SurfaceHolder.Callback。
Canvas倒像是一个拥有一段绘制区域的画家,通过surface.lockCanvas(Rect dirty)来获得,并指定canvas只能在dirty范围进行对surface指定区域的绘制。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3952次
排名:千里之外
原创:32篇
(6)(1)(1)(2)(5)(1)(17)Rexroth CY2 10G2 00/90-0
最近被加入的企业
名片夹还没有企业信息,赶紧查看企业联系方式加入吧!
『北京康拉德科技有限公司』的联系方式为,010-,联系人:林经理
品牌:中任型号:Rexroth CY2 10G2 00/90-0 152Z 11/O1HX UM 22A Z15 418作用和用途:闸阀驱动方式:电磁阀阀体材质:衬塑料阀门结构特征:截门形开关方向:角行程连接形式:法兰压力环境类型:真空阀PN
以上是Rexroth CY2 10G2 00/90-0的详细介绍,包括Rexroth CY2 10G2 00/90-0的价格、型号、图片、厂家等信息!
GMC-I Messtechnik GmbH Sineax DME 401 146515 Hn:85-230V AC/DC 感应传感器norelem
工件夹具heidenhain
RumA 0150...
商机库包括所有采购、招标信息的汇总
与Rexroth CY2 10G2 00/90-0相关的产品信息
Rexroth CY2 10G2 00/90-0产品相关搜索
最新阀门产品
按排行字母分类:
我需要采购阀门,请供应商联系我....
马可波罗&&全心服务
联系电话:*
允许同品类其他优质供应商联系我&&国之画&&&&&&
&& &&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 apply image安装失败 的文章

 

随机推荐