Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系

article/2025/11/3 15:14:20

SurfaceHolder

版本:Android 2.2 r1

结构

继承关系

public interface SurfaceHolder

android.view.SurfaceHolder 

概述

抽象接口持有人显示表面。允许您控制面的大小和格式,编辑在suface的橡树,并监测到变化。此接口通常可通过SurfaceView来实现

当一个线程使用不同于正在运行的线程的SurfaceView的接口时,你应该仔细阅读lockCanvas()Callback.surfaceCreated()这两个抽象函数

常量值

public static final int SURFACE_TYPE_GPU 

常数已声明不赞成使用,已过时。

被忽略,该常量值在需要时自动设置。

Surface类型:创建适用于GPU加速的Surface 

常量值:2 (0x00000002)

public static final int SURFACE_TYPE_HARDWARE 

常数已声明不赞成使用,已过时。

被忽略,该常量值在需要时自动设置。

Surface类型:创建适用于DMA(Direct memory access )引擎和硬件加速的Surface 

常量值:1 (0x00000001) 

public static final int SURFACE_TYPE_NORMAL 

Surface类型:创建用RAM缓存原生数据的普通Surface  

常量值:0 (0x00000000

public static final int SURFACE_TYPE_PUSH_BUFFERS 

Surface类型:创建一个不包含原生数据Surface,Surface用到的数据由其他对象提供。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了,否则将出现错误。 

常量值:3 (0x00000003)  

公共方法

public abstract void addCallback (SurfaceHolder.Callback callback) 

Surface持有者添加回调接口,一个持有者可以关联多个回调接口。

参数

callback  新的回调接口  

public abstract Surface getSurface () 

直接获取Surface对象,这个Surface对象并不总是能获取的。

例如:当使用SurfaceView, Surface的持有者直到该View隶属于当前窗口管理器,确认布局大小和屏幕的位置后才进行创建,你通常需要实现Callback.surfaceCreated寻找出可用的Surface

注意,如果你通过另外的线程直接访问Surface ,关键在于你正确的实现了Callback.surfaceCreated Callback.surfaceDestroyed 函数来确保你访问的线程的Surface是可用的,有效的,当一个线程正在使用该Surface,将不能得到释放,销毁。

这个方法的目的是用于经常需要直接访问Surface对象的框架(通常是通过本地代码),在设计API时总使用SurfaceHolder来改变Surface,而不是Surface对象本身。一个经验规则是应用程序代码不能调用该方法

返回   

Surface对象

public abstract Rect  getSurfaceFrame () 

检索当前Surface的大小

注意:不能修改发挥矩形区域大小,这是唯一安全的调用从SurfaceView的窗口线程,否则就需要放在lockCanvas()里面调用。

返回

Suface的矩形尺寸,左侧和顶部总为0

 

public abstract boolean isCreating () 

使用这个方法是来确定在进程中的Surface是否通过Callback方法正被创建,这是为了确定surfaceChanged(SurfaceHolder, int, int, int).方法是否能用。

返回

True 进程里的Suface正被创建

public abstract Canvas lockCanvas () 

开始编辑surface的像素,返回可以用来画到表面的位图Canvas如果表面尚未建立或无法进行编辑返回null。通常需要实现Callback.surfaceCreated找出Surface方可使用。

Surface的内容再从调用unlockCanvas()  lockCanvas(),之间被保存,为此,在Surface区域内的没有个像素都将被画出,仅一个例外是当脏矩形被指定的时候,非脏像素将会被保存。

如果当Surface没有初始化(Callback.surfaceCreated之前或者Callback.surfaceDestroyed之后),你反复调用它,为了避免耗费CPU,这些调用将以缓慢的速度被杀死。

如果没有返回null值,这个函数在内部直到调用unlockCanvasAndPost(Canvas)函数,才持有锁,来防止SurfaceView在绘制的时候被创建,销毁,或者修改surface,因为当调用Callback.surfaceDestroyed你不需要创建一个特殊的同步绘制线程 所以你能更方便的直接访问这个Sufrace

返回

用来进行绘制的Canvas

public abstract Canvas lockCanvas (Rect dirty) 

lockCanvas()一样,但允许指定一个脏矩形,再这个矩形的每个像素都必须被绘制,脏矩形外的像素将被保存直到下次调用lockCanvas()

参数

dirty  将被修改的Surface区域

返回

用来进行绘制的Canvas

参见

lockCanvas ()

public abstract void removeCallback (SurfaceHolder.Callback callback) 

Surface持有者中删除先前添加的回调接口

参数

callback  要删除的回调接口  

public abstract void setFixedSize (int width, int height) 

使surface固定大小,他将永远不能该表大小,当和SurfaceView一起工作时,这必须被同一运行的SurfaceView的窗口线程来调用

参数

width  surface的宽

height  surface的高.  

public abstract void setFormat (int format) 

设置surface所需的像素格式。默认是不透明的,当和SurfaceView一起工作时,这必须被同一运行的SurfaceView的窗口线程来调用

参数 

format  PixelFormat的常量

参见

PixelFormat

public abstract void setKeepScreenOn (boolean screenOn) 

surface被显示的时候是否启用或禁用屏幕保持打开状态,默认是禁用,允许屏幕关闭,启用选项有效时,可以安全的调用任何线程。

参数 

screenOn  ture时强制屏幕保持打开状态,fasle允许气关闭

public abstract void setSizeFromLayout () 

允许suface基于容器的布局来改变大小(这是默认的),当启用此功能,就应该监视surfaceChanged(SurfaceHolder, int, int, int)应对suface的大小变化,当和SurfaceView一起工作时,这必须被同一运行的SurfaceView的窗口线程来调用

public abstract void setType (int type) 

设置该surface的类型

参数

type  surface的内存类型

public abstract void unlockCanvasAndPost (Canvas canvas) 

surface完成编辑像素,该函数调用后,surface的当前像素就会在屏幕上显示,但是它的数据会丢失,尤其是没有保证surface数据保持不变的时候再次调用lockCanvas()

参数

canvas  先前调用lockCanvas()返回的Canvas

参考

lockCanvas()

补充

在用SurfaceView进行游戏开发过程中,用到SurfaceHolder来处理它的Canvas上画的效果和动画是必不可少的。用于控制表面,大小,像素等。其中特别要注意以下的几个函数:
abstract void addCallback(SurfaceHolder.Callback callback);

// SurfaceView当前的持有者一个回调对象。

abstract Canvas lockCanvas();

// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。


abstract Canvas lockCanvas(Rect dirty);

// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。

abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
  

在android中开发游戏,一般来说,或想写一个复杂一点的游戏,是必须用到SurfaceView来开发的。

经过这一阵子对android的学习,我找到了自已在android中游戏开发的误区,不要老想着用Layoutview去实现,不要将某个游戏

中的对象做成一个组件来处理。应该尽量想着在Canvas(画布)中画出游戏戏中的背景、人物、动画等...

SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView是提供给需要直接画像素而不是使用

窗体部件的应用使用的。Android图形系统中一个重要的概念和线索是surfaceView及其子类(如TextView, Button

要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理viewsurface上的绘图操作,如画点画线。

还要注意的是,使用它的时候,一般都是出现在最顶层的

使用的SurfaceView的时候,一般情况下还要对其进行创建,销毁,改变时的情况进行监视,这就要用到SurfaceHolder.Callback.













1、Surface


Surface

extends Object
implements Parcelable
java.lang.Object
   ↳android.view.Surface

Class Overview


Handle onto a raw buffer that is being managed by the screen compositor.

简单翻译:

Surface是原始图像缓冲区(raw buffer)的一个句柄,而原始图像缓冲区是由屏幕图像合成器(screen compositor)管理的。




1.1、 就如在C语言编程一样,通过一个文件的句柄,就可以操作文件,获取文件的内容。 同样的,通过Surface就可以获取raw buffer其中的内容。原生缓冲区(raw buffer)存储着当前窗口的像素数据。


1.2、事实上,当得到一个Surface对象时,同时会得到一个Canvas(画布)对象。这一点可以通过查看\frameworks\base\core\Java\Android\view\Surface.java文件可知道Surface类定义了一个Canvas成员变量


[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. //@\frameworks\base\core\java\android\view\Surface.java  
  2. // The mSurfaceControl will only be present for Surfaces used by the window  
  3. // server or system processes. When this class is parceled we defer to the  
  4. // mSurfaceControl to do the parceling. Otherwise we parcel the  
  5. // mNativeSurface.  
  6. private int mSurfaceControl;  
  7. private int mSaveCount;  
  8. private Canvas mCanvas;  
  9. private int mNativeSurface;  
  10. private int mSurfaceGenerationId;  
  11. private String mName;  

1.3、 理解Canvas对象,可以把它当做画布,Canvas的方法大多数是设置画布的大小、形状、画布背景颜色等等,要想在画布上面画画,一般要与Paint对象结合使用,顾名思义,Paint就是画笔的风格,颜料的色彩之类的。

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. // 创建画笔    
  2. Paint paint = new Paint();    
  3. paint.setColor(Color.RED);// 设置红色    
  4.   
  5. canvas.drawCircle(602010, paint);// 画一个圆    


1.4、Surface本身的作用类似一个句柄,得到了这个句柄就可以得到其中的Canvas、原生缓冲器以及其它方面的内容。


1.5、Surface实现了Parcelable接口,(implements Parcelable),也就是说Surface对象可以把显示内容的数据写入到 Parcel 中,并且能够从Parcel读回数据。

Parcelable

android.os.Parcelable
Known Indirect Subclasses

Class Overview


Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field calledCREATOR, which is an object implementing theParcelable.Creator interface.

简单翻译:
       实现这个接口的对象可以写入数据到Parcel,同时也可以把数据读出来。



2、SurfaceView


SurfaceView

extends View
java.lang.Object
   ↳android.view.View
    ↳android.view.SurfaceView
Known Direct Subclasses

Class Overview


Provides a dedicated drawing surface embedded inside of a view hierarchy. You can control the format of this surface and, if you like, its size; the SurfaceView takes care of placing the surface at the correct location on the screen

The surface is Z ordered so that it is behind the window holding its SurfaceView; the SurfaceView punches a hole in its window to allow its surface to be displayed. The view hierarchy will take care of correctly compositing with the Surface any siblings of the SurfaceView that would normally appear on top of it. This can be used to place overlays such as buttons on top of the Surface, though note however that it can have an impact on performance since a full alpha-blended composite will be performed each time the Surface changes.

Access to the underlying surface is provided via the SurfaceHolder interface, which can be retrieved by callinggetHolder().

The Surface will be created for you while the SurfaceView's window is visible; you should implementsurfaceCreated(SurfaceHolder)andsurfaceDestroyed(SurfaceHolder) to discover when the Surface is created and destroyed as the window is shown and hidden.

One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen. If you are going to use it this way, you need to be aware of some threading semantics:

  • All SurfaceView and SurfaceHolder.Callback methods will be called from the thread running the SurfaceView's window (typically the main thread of the application). They thus need to correctly synchronize with any state that is also touched by the drawing thread.
  • You must ensure that the drawing thread only touches the underlying Surface while it is valid -- betweenSurfaceHolder.Callback.surfaceCreated() andSurfaceHolder.Callback.surfaceDestroyed().

简单翻译:

         SurfaceView提供了一个专门用于绘制的surface,这个surface内嵌于。你可以控制这个Surface的格式和尺寸。Surfaceview控制这个Surface在屏幕的正确绘制位置。

        surface是Z-ordered的(也就是说在xyz坐标系中,按照Z坐标排序的,Z值大的表面覆盖在Z值小的表面的上方),这表明它总在自己所在窗口的后面。surfaceview在显示窗口处为Surface提供了一个可见区域,通过这个区域,才能看到Surface里面的内容。可以放置一些覆盖图层(overlays)在Surface上面,如Button、Textview之类的。但是,需要注意的是,如果Surface上面有全透明的控件,那么随着Surface的每一次变化,这些全透明的控件就会重新渲染,这样的话,就影响性能与显示的效果。

        你可以通过SurfaceHolder这个接口去访问Surface,而执行getHolder()方法可以得到SurfaceHolder接口。

        当SurfaceView的窗口可见时,Surface就会被创建,当SurfaceView窗口隐藏时,Surface就会被销毁。当然了,你也可以通过复写surfaceCreated(SurfaceHolder) 和 surfaceDestroyed(SurfaceHolder)  这两个方法来验证一下Surface何时被创建与何时被销毁。

        SurfaceView提供了一个运行在渲染线程的surface,若你要更新屏幕,你需要了解以下线程知识。
  • 所有SurfaceView 和 SurfaceHolder.Callback的方法都应该在主线程(UI线程)里面调用,应该要确保渲染进程所访问变量的同步性。
  • 你必须确保只有当Surface有效的时候,(也就是当Surface的生命周期在SurfaceHolder.Callback.surfaceCreated() 和SurfaceHolder.Callback.surfaceDestroyed()之间)才能让渲染进程访问。


2.1、SurfaceView与Surface的联系

简单来说,SurfaceView与Surface的联系就是,Surface是管理显示内容的数据(implementsParcelable),包括存储于数据的交换。而SurfaceView就是把这些数据显示出来到屏幕上面。

两者联系如图所示:



3、SurfaceHolder


SurfaceHolder

android.view.SurfaceHolder

Class Overview


Abstract interface to someone holding a display surface. Allows you to control the surface size and format, edit the pixels in the surface, and monitor changes to the surface. This interface is typically available through theSurfaceView class.

When using this interface from a thread other than the one running its SurfaceView, you will want to carefully read the methodslockCanvas()andCallback.surfaceCreated().

简单翻译:

        SurfaceHolder是控制surface的一个抽象接口,你可以通过SurfaceHolder来控制surface的尺寸和格式,或者修改surface的像素,监视surface的变化等等,SurfaceHolder是SurfaceView的典型接口。

        与直接控制SurfaceView来修改surface不同,使用SurfaceHolder来修改surface时,需要注意lockCanvas() 和Callback.surfaceCreated().这两个方法。

SurfaceHolder控制surface的流程所使用的几个方法。

3.1、abstract void    addCallback(SurfaceHolder.Callback callback)
             Add a Callback interface for this holder.// 给SurfaceHolder一个回调对象。

3.2、abstract Canvas    lockCanvas(Rect dirty)
             Just like lockCanvas() but allows specification of a dirty rectangle.
             // 锁定画布中的某一个区域,返回的画布对象Canvas(当更新的内容只有一个区域时,同时要追求高效,可以只更
             新一部分的区域,而不必更新全部画布区域)

3.3、abstract Canvas    lockCanvas()
             Start editing the pixels in the surface.// 锁定画布,返回的画布对象Canvas

3.4、abstract void    removeCallback(SurfaceHolder.Callback callback)
             Removes a previously added Callback interface from this holder.//移除回调对象

3.5、abstract void    unlockCanvasAndPost(Canvas canvas)
             Finish editing pixels in the surface.// 结束锁定画图,并提交改变。

4、SurfaceHolder.Callback

SurfaceHolder.Callback

android.view.SurfaceHolder.Callback
Known Indirect Subclasses

Class Overview


A client may implement this interface to receive information about changes to the surface. When used with aSurfaceView, the Surface being held is only available between calls tosurfaceCreated(SurfaceHolder)andsurfaceDestroyed(SurfaceHolder). The Callback is set withSurfaceHolder.addCallback method.

简单翻译:

SurfaceHolder.Callback是监听surface改变的一个接口

//surface发生改变时被调用


4.2、public abstract voidsurfaceCreated(SurfaceHolder holder)

Parameters
holderThe SurfaceHolder whose surface is being created

//在surface创建时被调用,一般在这个方法里面开启渲染屏幕的线程。


4.3、public abstract voidsurfaceDestroyed(SurfaceHolder holder)

Parameters
holderThe SurfaceHolder whose surface is being destroyed.
   //销毁时被调用,一般在这个方法里将渲染的线程停止。

 


附上上述所说几种的联系方法

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. SurfaceHolder = SurfaceView.getHolder();  
  2.   
  3. Surface = SurfaceHolder.getSurface();  
  4.   
  5. Canvas =SurfaceHolder.LockCanvas(Rect dirty)  
  6.   
  7. Canvas   =Surface.lockCanvas(Rect dirty)  


5、Demo小程序

共有两个class效果图如下,具体看代码和注释。


进入程序,执行

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. public void surfaceCreated(SurfaceHolder holder)  

然后执行

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. public void surfaceChanged(SurfaceHolder holder, int format, int width,  int height)  

退出程序调用surfaceDestroyed,释放资源。

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. public void surfaceDestroyed(SurfaceHolder holder)  



/****************************************************************/

效果图:


@MySurfaceView.java

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * author: conowen 
  3.  * e-mail: conowen@hotmail.com 
  4.  * date  :  2012.8.4 
  5.  */  
  6. package com.conowen.SurfaceViewDemo;  
  7.   
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10.   
  11. public class SurfaceViewDemoActivity extends Activity {  
  12.     /** Called when the activity is first created. */  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.        // setContentView(R.layout.main);  
  17.         setContentView(new MySurfaceView(this));  
  18.           
  19.     }  
  20. }  


@SurfaceViewDemoActivity.java

[java]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2.  * author: conowen 
  3.  * e-mail: conowen@hotmail.com 
  4.  * date  :  2012.8.4 
  5.  */  
  6. package com.conowen.SurfaceViewDemo;  
  7.   
  8. import android.content.Context;  
  9. import android.graphics.Canvas;  
  10. import android.graphics.Color;  
  11. import android.graphics.Paint;  
  12. import android.graphics.Rect;  
  13. import android.util.Log;  
  14. import android.view.SurfaceHolder;  
  15. import android.view.SurfaceView;  
  16.   
  17. public class MySurfaceView extends SurfaceView implements  
  18.         SurfaceHolder.Callback {  
  19.   
  20.     private String TAG = "conowen";  
  21.       
  22.     private SurfaceHolder sfh;  
  23.     private boolean ThreadFlag;  
  24.     private int counter;  
  25.     private Canvas canvas;  
  26.   
  27.     private Thread mThread = new Thread(new Runnable() {  
  28.   
  29.         @Override  
  30.         public void run() {  
  31.             // TODO Auto-generated method stub  
  32.             while (ThreadFlag) {  
  33.   
  34.                 // 锁定画布,得到Canvas对象  
  35.                 canvas = sfh.lockCanvas();  
  36.   
  37.                 // 设定Canvas对象的背景颜色  
  38.                 canvas.drawColor(Color.GREEN);  
  39.   
  40.                 // 创建画笔  
  41.                 Paint p = new Paint();  
  42.                 // 设置画笔颜色  
  43.                 p.setColor(Color.RED);  
  44.                 // 设置文字大小  
  45.                 p.setTextSize(40);  
  46.   
  47.                 // 创建一个Rect对象rect  
  48.                 // public Rect (int left, int top, int right, int bottom)  
  49.                 Rect rect = new Rect(10050400350);  
  50.                 // 在canvas上绘制rect  
  51.                 canvas.drawRect(rect, p);  
  52.                 // 在canvas上显示时间  
  53.                 // public void drawText (String text, float x, float y, Paint  
  54.                 // paint)  
  55.                 canvas.drawText("时间 = " + (counter++) + " 秒"500200, p);  
  56.   
  57.                 if (canvas != null) {  
  58.                     // 解除锁定,并提交修改内容,更新屏幕  
  59.                     sfh.unlockCanvasAndPost(canvas);  
  60.                 }  
  61.                 try {  
  62.                     Thread.sleep(1000);  
  63.                 } catch (InterruptedException e) {  
  64.                     // TODO Auto-generated catch block  
  65.                     e.printStackTrace();  
  66.                 }  
  67.             }  
  68.         }  
  69.   
  70.     });  
  71.   
  72.     public MySurfaceView(Context context) {  
  73.         super(context);  
  74.         // TODO Auto-generated constructor stub  
  75.   
  76.         // 通过SurfaceView获得SurfaceHolder对象  
  77.         sfh = this.getHolder();  
  78.   
  79.         // 为SurfaceHolder添加回调结构SurfaceHolder.Callback  
  80.         sfh.addCallback(this);  
  81.   
  82.     }  
  83.   
  84.     @Override  
  85.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  86.             int height) {  
  87.         // TODO Auto-generated method stub  
  88.         Log.i(TAG, "surfaceChanged");  
  89.   
  90.     }  
  91.   
  92.     @Override  
  93.     public void surfaceCreated(SurfaceHolder holder) {  
  94.         // TODO Auto-generated method stub  
  95.         Log.i(TAG, "surfaceCreated");  
  96.         counter = 0;  
  97.         ThreadFlag = true;  
  98.         mThread.start();  
  99.   
  100.     }  
  101.   
  102.     @Override  
  103.     public void surfaceDestroyed(SurfaceHolder holder) {  
  104.         // TODO Auto-generated method stub  
  105.         Log.i(TAG, "surfaceDestroyed");  
  106.         ThreadFlag = false;  
  107.   
  108.     }  
  109.   
  110. }  


http://chatgpt.dhexx.cn/article/UmkyQKnp.shtml

相关文章

Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系

一、Surface Surface就是“表面”的意思。在SDK的文档中,对Surface的描述是这样 的:“Handle onto a raw buffer that is being managed by the screen compositor”,翻译成中文就是“由屏幕显示内容合成器(screen compositor)所管理的原生缓…

android surfaceview学习(一)

推荐阅读: https://blog.csdn.net/luoshengyang/article/details/8661317 https://www.cnblogs.com/xuling/archive/2011/06/06/android.html https://blog.csdn.net/zcmain/article/details/14454953 1、surfaceview默认是黑色的背景,并且给sfv设置背景…

Activity、Fragment和Surface的生命周期

这里首先推荐大家一本Android的学习书籍:《第一行代码》,这本书还是写得非常好的。好了,进入正题,我们先来了解一下Activity、Fragment的的生命周期中经历的几个阶段。 ActivityFragment 下面我们假设有如下的场景,Act…

Java进度条

转自:点击打开链接 进度条用在很多的地方,比如登录验证等待过程、程序加载、数据下载、数据更新与删除等,它可以一目了然的让用户知道程序执行的进度。下面给大家看一个登录验证的进度条,首先上效果图: 在代码中未连接…

java窗口进度条_java进度条窗口具体如何制作?

可视化窗口是大部分游戏的常态,今天我们就来了解下如何编写进度条窗口,快跟小编一起看看吧。 一、在包右击new->other->WindowBuilder->JFrame->name叫Guithreadpackage guithread; import java.awt.BorderLayout; import java.awt.EventQue…

java进度条_「java进度条」Java JProgressBar类(进度条) - seo实验室

java进度条 简介 利用JprogressBar类可以实现一个进度条。它一般是一种颜色部分或完全填充的矩形。缺省情况下,进度条配备了一个凹陷的边框,并水平放置。 进度条还可以选择显示一个字符串,这个字符串在进度条矩形的中央位置上显示。这个字符串缺省时为耗时任务已完成的百分比…

Java 进度条

效果 代码 思路:使用NumberFormat类来格式化数字,显示完后,退格覆盖重新显示新的数字 import java.text.NumberFormat;public class Test {public static void main(String[] args) throws Exception {System.out.print("Progress:"…

Java图形化界面---进度条

目录 一、进度条的介绍 二、创建进度条 三、简单案例 四、子线程创建进度条 (1)为什么要使用子线程创建进度条 (2)子线程创建进度条的代码 五、创建进度对话框 (1)如何创建进度对话框 (2&…

Java图形化界面编程超详细知识点(7)——进度条

目录 4 JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条 4.1 创建进度条 4 JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条 进度条是图形界面中广泛使用的GUI组件,当复制一个较大的文件时,操作系统会显示一个进度条&#…

Java制作进度条

【效果图】 【描述】 进度条宽度保持和窗口宽度一致,进度最小值为0,最大值为100,每100毫秒进度值1,进度条中间显示进度百分比 【代码】 package test;import java.awt.*; import java.awt.event.*;import javax.swing.*;public…

QT:QGraphicsScene与QGraphicsView使用render()函数渲染图片

render()函数看官方文档,会有很多不懂得地方,以下为实践出来的效果。 当我们想要用QPaint() 绘制我们在QGraphicsView看到的部分时,不仅要绘制正确的图片大小,还需要使用 render() 渲染正确的大小。当我们只想要绘制坐标系中矩形…

Qt图形特效:QGraphicsOpacityEffect

一、描述 不透明度效果使源具有不透明度。该效果对于使源半透明非常有用,类似于淡入/淡出序列。可以使用setOpacity()函数修改不透明度。 二、属性成员 1、opacity : qreal。此属性保存不透明度。该值应在0.0到1.0的范围内,其中0.0是完全透明的&#…

图形视图(02):【类】QGraphicsScene [官翻]

文章目录 详述事件处理和传播 公共类型enum ItemIndexMethodenum SceneLayer 属性backgroundBrush: QBrushbspTreeDepth: intfocusOnTouch: boolfont: QFontforegroundBrush: QBrushitemIndexMethod: ItemIndexMethodminimumRenderSize: qrealpalette: QPalette**sceneRect**: …

Qt中使用QGraphicsScene重写drawBackGround绘制背景

Qt中使用QGraphicsScene重写drawBackGround绘制背景 需求解释 我是想这学习Qt的界面设计,希望能够对界面背景进行优化然后使用Qt的界面与图形画背景网格。首先查资料 通过查找博客发现很简单,就是新建一个类继承于QGraphicsScene,于是我就…

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能: 提供用管理大量数据项的高速接口传播事件到每一个图形项…

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求,还是把完整的工程文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看运行效果,我用的群创7寸屏,主机是mini2440,分辨率是800*480,程序写比较粗糙…

Qt QGraphicsScene、QGraphicsView类实现仪表盘

Qt QGraphicsScene、QGraphicsView类实现仪表盘 【1】UI界面设计【2】效果【3】QGraphicsScene简介【4】QGraphicsEllipseItem简介【5】QGraphicsPolygonItem简介【6】QGraphicsLineItem简介【7】QGraphicsView简介【8】仪表源码头文件源码 【1】UI界面设计 【2】效果 【3】QGr…

qt QGraphicsScene 简单例子

坐标 graphicsView是Widget这个界面的子控件, 他的位置是左上角坐标为(30,30) 他的宽度为431,高度为431. 如果在graphicsView 这个子控件中, 继续加入 子控件A,由于graphicsView比较特殊。 根据它的align…

QGraphicsScene设置SceneRect

简要说明 QGraphicsScene场景区域,可在构造QGraphicsScene对象时设定,也可通过函数setSceneRect设定。QGraphicsScene场景区域中坐标原点的位置,会影响到图形项的坐标设定,进而影响图形项在场景中的显示位置。以将图片显示在中心…

QT QGraphicsScene / QGraphicsView中 sceneRect 使用详细说明

接触QT不久,发现QT的Graphics View框架坐标使用和平常不一样,尤其sceneRect的作用。 官方文档关于这部分介绍真是蛋疼,网上说的也寥寥。没法自己研究了一下,其实这块内容QT设计的很方便,只是文档讲解的太烂&#xff0c…