GUI修改注意事项

本文详细解析了如何在Android系统中修改Switch控件样式,包括选择主题、理解主题层级、复制并修改样式文件等内容,并提供了具体实例演示。通过修改themes_device_defaults.xml文件中的Widget.DeviceDefault.CompoundButton.Switch样式,可以实现GUI控件的个性化定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、位置

在Android的frameworks/base/core/res/res/values目录下有一下几个文件:

themes.xml

themes_device_defaults.xml

styles.xml

styles_device_defaults.xml

分别定义了各种系统Theme,Style。

二、主题

主要关注themes.xml,themes_device_defaults.xml两个文件。themes.xml定义了android低版本的theme和Holo theme,themes_device_defaults.xml定义了DeviceDefault主题(继承自Holo主题),实际上就是在Holo主题上定制主题(For厂商)。

系统如何去选择默认的主题呢?


当<11时,使用以前低版本主题;当>=11&&<14,使用Holo主题;>14的时候,使用DeviceDefault主题。

、系统主题Theme列表

系统默认大的主题是三种:Theme,Theme.Holo,Theme.DeviceDefault, 但是实际上在此基础系统还定义了大量的派生主题。


四、修改注意事项:

  1、修改后不能影响CTS测试

  2、修改文件只是厂商一个Theme,不影响原生的Theme

  3styles.xml themes.xml文件是不能修改的,修改后不能通过CTS测试

 

五、例子(我这里以switch 控件为例子):

1、这里以修改Theme.DeviceDefault主题来实现GUI公共控件的修改。这个主题就是留给厂商用来定制。如果你不修改这个主题,而是新建一个主题,那是不现实的,首先普通的开发者使用的SDK里面没有与之对应的api 接口,其次,你还要修改加载主题的相关部分。

 

2、原始控件的继承关系

   原始的控件图:

  

  

   原始的Theme.DeviceDefault里面定义switch控件的样式

  

   由上图可看出调用的是:@android:style/Widget.DeviceDefault.CompoundButton.Switch,而这个style可以去styles_device_defaults.xml文件中找到(一般themes_device_defaults.xml

调用的style都在这个文件里)

 

 

如上图,可看出其实Widget.DeviceDefault.CompoundButton.Switch风格继承自Widget.Holo.CompoundButton.Switch,(一般styles_device_defaults.xml里面的style都继承自文件styles.xml)。

 

  如上图,这个就是Widget.Holo.CompoundButton.Switch风格。 根据以上的调用关系,可以看出:关于Switch系统控件在Theme.DeviceDefault 主题中调用的风格最终是style.xml中的Widget.Holo.CompoundButton.Switch

3、修改方案

     修改后的控件图(不会作图,就拿系统自带的图片五角星代替了):

    

   前面我们已经说过了,styles.xml与 themes.xml 文件是不能修改的,那么问题来了,我们如何修改呢?

(1)       首先:

我们可以把style.xml中的Widget.Holo.CompoundButton.Switch 风格的所有<item>复制到styles_device_defaults.xml中的Widget.DeviceDefault.CompoundButton.Switch 中。

如下图:


然后,你就可以在这里面修改风格的属性了(<item>属性会覆盖掉parent里面的<item>属性)。

注意事项:

①、你不能把parent的属性去掉,去掉后会报异常Error retrieving parent for item: No resourcefound that matches the given name 'Widget.DeviceDefault.CompoundButton' 。造成这个异常的原因可看我的博客:

http://blog.youkuaiyun.com/daweibalang717/article/details/40738073

②、看完博客后,你就会明白,如果要把parent属性去掉的话,你就需要把Widget.DeviceDefault.CompoundButton.Switch的名字给更改了。修改成不带(.)的名字。

 

③、如果你要删掉一个<item>属性,那就不能覆盖父类的<item>,那么你就需要把此风格的(.)父类给继承了。比如,我要删掉


上图属性,但是如果删掉它,父类Widget.Holo.CompoundButton.Switch里面还有一条,就不能覆盖了。那么你可以把Widget.Holo.CompoundButton.Switch的(.)父类给继承了。Widget.Holo.CompoundButton.Switch的(.)父类就是Widget.Holo.CompoundButton

如下图:


④、基于第三条,不建议这么做,因为你删掉一个属性,可能造成未知异常。比如我把


文字属性去掉了。就报了空指针异常(Switch控件计算布局大小的时候用到了文字属性)。

(2)其次:

  我们要修改相关属性,以达到图片效果。

android:track 属性对应的是背景布局,就是图片中灰色的部分。

android:thumb 对应的就是Switch中的五角星(修改后的样式)的部分。

android:switchTextAppearance 文本外观(修改前的样式里面带有文字 ON  OFF )

android:textOn  打开时的文本(原始样式为  ON)

android:textOff  关闭时的文体  (原始样式为  OFF)

android:thumbTextPadding 这个应该是文本的距离控件周边的边距

android:switchMinWidth  控件的最小宽度

android:switchPadding  距离周边的边距

 

 

我们要把Switch控件的样子由


变成


 

1、要把文本给去掉。

那么就修改文本属性为:


2、把按钮变成五角星

   这里要修改


   属性,可以看出他调用的是资源文件drawable下的东西。路径为:\frameworks\base\core\res\res\drawable\switch_inner_holo_dark.xml

 内容为:

  

这里才是真实调用图片的地方。那么我们能在这里修改吗?答案是不能,因为你修改这个文件的话,系统其他主题也调用的是这个文件。我们需要把此文件再复制一份,起一个新的唯一名字。我起的名字为switch_inner_holo_dark_device.xml,然后再在这个新文件里面修改调用的图片资源,


我修改成了调用小星星的资源文件。然后再修改android:thumb属性为:


3、把控件变短

  因为你把控件里面的文字去掉了。方块换成了小星星,修改后控件就显的过长。那么就要把控件android:switchMinWidth 属性更改一下,我改成了原先的一半。

 

综上,总体改完后,styles_device_defaults.xml中的

Widget.DeviceDefault.CompoundButton.Switch"属性是这样的:


到此,这个例子修改完成。

 

 

4、测试(刷机我们修改后的OS)

 你可以在eclipse里面建立一个项目,在AndroidManifest.xml文件中,把最小支持的API 设置成14


然后把Activity的Theme设置成

android:theme="@android:style/Theme.DeviceDefault"

然后在布局文件里面增加一个Switch 控件,运行APK就可以看到效果了。

修改前:


修改后:

 

六、参考文档:

http://www.cnblogs.com/qianxudetianxia/p/3725466.html.

http://www.cnblogs.com/qianxudetianxia/p/3996020.html

<think>好的,我现在需要帮助用户解决如何在MATLAB中自定义和修改GUI界面。首先,我需要回想一下用户提到的引用内容,引用[1]提到了MATLAB GUI卡顿和一些界面编程的总结,特别是关于GUIDE自动生成函数体,函数名通常是控件Tag加上回调类型名,参数是hObject、eventdata和handles。用户之前的问题可能涉及到GUI的卡顿问题,现在他们想进一步了解如何自定义和修改界面。 首先,我应该确定用户使用的是传统GUIDE还是较新的App Designer,因为MATLAB现在推荐使用App Designer。但用户引用了GUIDE相关内容,可能他们仍在使用GUIDE。不过,为了全面,我应该涵盖两种方法。 接下来,我需要分步骤说明如何修改GUI界面。对于GUIDE用户,需要指导他们打开.fig文件,调整控件属性,设置回调函数,并保存运行。同时,要提到属性检查器中的Tag属性,因为这是回调函数命名的关键,如引用[1]中提到的控件Tag+回调类型名。这里需要强调Tag的重要性,避免回调函数无法正确关联。 对于App Designer,步骤类似,但界面更现代,需要说明如何拖放组件和编辑回调函数。同时,要提到两种方法的兼容性,GUIDE可能逐渐被淘汰,所以推荐迁移到App Designer。 用户可能遇到的问题包括如何找到控件属性,如何编写回调函数,以及如何调试界面卡顿。引用[1]提到GUIDE生成的回调函数结构,可以在这里引用,说明如何编辑这些函数。同时,卡顿问题可能与回调函数执行效率有关,可以建议优化代码或使用定时器。 在生成相关问题部分,需要考虑用户可能的后续问题,比如如何添加新控件、处理数据传递、解决卡顿或美化界面。这些问题可以帮助用户进一步探索GUI开发的不同方面。 需要确保回答结构清晰,分步骤说明两种方法,并给出注意事项和相关建议。同时,语言要简明,使用中文,正确应用LaTeX格式,如变量使用$...$,但可能在这个问题中数学公式较少,主要注意代码块和引用标识的正确使用。 最后,检查是否有遗漏点,比如数据存储(handles结构体),回调函数的参数说明,以及迁移工具的存在,这些都能帮助用户更好地理解和修改GUI界面。</think>在MATLAB中自定义和修改GUI界面可以通过以下两种主要方式实现,分别针对传统GUIDE工具和现代App Designer: ### 一、使用GUIDE修改GUI界面(传统方法) 1. **打开GUI文件** - 在命令窗口输入`guide`,选择已存在的`.fig`文件打开 - 或直接双击项目中的`.fig`文件进入编辑模式 2. **控件属性修改** - 右键点击控件 → 选择"Property Inspector" - 关键属性包括: - `Tag`:用于生成回调函数名(如`pushbutton1_Callback`)[^1] - `String`:显示文本 - `Callback`:直接编辑触发事件代码 3. **回调函数编辑** ```matlab function pushbutton1_Callback(hObject, eventdata, handles) % 获取输入框内容 input_str = get(handles.edit1, 'String'); % 更新输出 set(handles.text1, 'String', ['您输入了:' input_str]); ``` ### 二、使用App Designer(推荐新项目) 1. **界面创建** - 通过`appdesigner`命令启动 - 拖放左侧组件库的控件到画布 2. **回调函数绑定** ```matlab % 按钮回调函数示例 methods (Access = private) function ButtonPushed(app, event) app.Label.Text = ['当前时间:' datestr(now)]; end end ``` ### 三、重要注意事项 1. **数据存储** - GUIDE使用`handles`结构体共享数据 - App Designer通过`app.`前缀访问属性 2. **兼容性建议** - MATLAB R2016a+推荐使用App Designer - 旧版GUIDE项目可用`migrateGUI`工具转换 ```matlab % 典型GUI初始化结构 function varargout = myGUI(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @myGUI_OpeningFcn, ... 'gui_OutputFcn', @myGUI_OutputFcn); [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值