如果一个bartoggleswitchitem是活动的,该属性允许设置哪个属性

输入关键字或相关内容进行搜索
Mui v3.0.0 (http://dev./mui)Bug:
mui 关于toggle开关只设置一次,当dom改变后加载数据开关不起作用:
自己解决:将代码部分抽出方法,在dom内容最后一次加载完成时调用 toggleSwitchInit($,window,name);
success: function(data) {
//console.log(data)
$(&body&).html(data);
toggleSwitchInit(mui,window,&toggle&);
},以下是mui源码/**
* Toggles switch
* @param {type} $
* @param {type} window
* @param {type} name
* @returns {undefined}
(function($, window) {
。。。。。
}function toggleSwitchInit($,window,name){
//console.log(&toggleSwitchInit&);
var CLASS_SWITCH = 'mui-switch';
var CLASS_SWITCH_HANDLE = 'mui-switch-handle';
var CLASS_ACTIVE = 'mui-active';
var CLASS_DRAGGING = 'mui-dragging';var CLASS_DISABLED = 'mui-disabled';
var SELECTOR_SWITCH_HANDLE = '.' + CLASS_SWITCH_HANDLE;
var handle = function(event, target) {
if (target.classList && target.classList.contains(CLASS_SWITCH)) {
$.registerTarget({
name: name,
index: 100,
handle: handle,
target: false
var Toggle = function(element) {
this.element =
this.classList = this.element.classL
this.handle = this.element.querySelector(SELECTOR_SWITCH_HANDLE);
this.init();
this.initEvent();
Toggle.prototype.init = function() {
this.toggleWidth = this.element.offsetW
this.handleWidth = this.handle.offsetW
this.handleX = this.toggleWidth - this.handleWidth - 3;
Toggle.prototype.initEvent = function() {
this.element.addEventListener($.EVENT_START, this);
this.element.addEventListener('drag', this);
this.element.addEventListener('swiperight', this);
this.element.addEventListener($.EVENT_END, this);
this.element.addEventListener($.EVENT_CANCEL, this);
Toggle.prototype.handleEvent = function(e) {
if (this.classList.contains(CLASS_DISABLED)) {
switch (e.type) {
case $.EVENT_START:
this.start(e);
case 'drag':
this.drag(e);
case 'swiperight':
this.swiperight();
case $.EVENT_END:
case $.EVENT_CANCEL:
this.end(e);
Toggle.prototype.start = function(e) {
this.handle.style.webkitTransitionDuration = this.element.style.webkitTransitionDuration = '.2s';
this.classList.add(CLASS_DRAGGING);
if (this.toggleWidth === 0 || this.handleWidth === 0) { //当switch处于隐藏状态时,width为0,需要重新初始化
this.init();
Toggle.prototype.drag = function(e) {
var detail = e.
if (!this.isDragging) {
if (detail.direction === 'left' || detail.direction === 'right') {
this.isDragging =
this.lastChanged =
this.initialState = this.classList.contains(CLASS_ACTIVE);
if (this.isDragging) {
this.setTranslateX(detail.deltaX);
e.stopPropagation();
detail.gesture.preventDefault();
Toggle.prototype.swiperight = function(e) {
if (this.isDragging) {
e.stopPropagation();
Toggle.prototype.end = function(e) {
this.classList.remove(CLASS_DRAGGING);
if (this.isDragging) {
this.isDragging =
e.stopPropagation();
$.trigger(this.element, 'toggle', {
isActive: this.classList.contains(CLASS_ACTIVE)
this.toggle();
Toggle.prototype.toggle = function(animate) {
var classList = this.classL
if (animate === false) {
this.handle.style.webkitTransitionDuration = this.element.style.webkitTransitionDuration = '0s';
this.handle.style.webkitTransitionDuration = this.element.style.webkitTransitionDuration = '.2s';
if (classList.contains(CLASS_ACTIVE)) {
classList.remove(CLASS_ACTIVE);
this.handle.style.webkitTransform = 'translate(0,0)';
classList.add(CLASS_ACTIVE);
this.handle.style.webkitTransform = 'translate(' + this.handleX + 'px,0)';
$.trigger(this.element, 'toggle', {
isActive: this.classList.contains(CLASS_ACTIVE)
Toggle.prototype.setTranslateX = $.animationFrame(function(x) {
if (!this.isDragging) {
var isChanged =
if ((this.initialState && -x & (this.handleX / 2)) || (!this.initialState && x & (this.handleX / 2))) {
isChanged =
if (this.lastChanged !== isChanged) {
if (isChanged) {
this.handle.style.webkitTransform = 'translate(' + (this.initialState ? 0 : this.handleX) + 'px,0)';
this.classList[this.initialState ? 'remove' : 'add'](CLASS_ACTIVE);
this.handle.style.webkitTransform = 'translate(' + (this.initialState ? this.handleX : 0) + 'px,0)';
this.classList[this.initialState ? 'add' : 'remove'](CLASS_ACTIVE);
this.lastChanged = isC
$.fn['switch'] = function(options) {
var switchApis = [];
this.each(function() {
var switchApi =
var id = this.getAttribute('data-switch');
if (!id) {
$.data[id] = new Toggle(this);
this.setAttribute('data-switch', id);
switchApi = $.data[id];
switchApis.push(switchApi);
return switchApis.length & 1 ? switchApis : switchApis[0];
$.ready(function() {
$('.' + CLASS_SWITCH)['switch']();
要回复问题请先或
关注: 1 人2011年3月 Web 开发大版内专家分月排行榜第二2011年1月 Web 开发大版内专家分月排行榜第二2010年10月 Web 开发大版内专家分月排行榜第二2010年9月 Web 开发大版内专家分月排行榜第二2010年6月 Web 开发大版内专家分月排行榜第二
2012年10月 Web 开发大版内专家分月排行榜第三2010年7月 Web 开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。本节引言:
本节给大家介绍的Android基本UI控件是:开关按钮ToggleButton和开关Switch,可能大家对着两个组件
并不熟悉,突然想起笔者的第一间外包公司,是否在wifi下联网的开关,竟然用的TextView,然后叫美工
且两个切换前后的图,然后代码中进行设置,当然点击TextView的时候判断状态,然后设置对应的背景...
好吧,也是醉了,好吧...本节讲解的两个其实都是开关组件,只是后者需要在Android 4.0以后才能使用
所以AndroidManifest.xml文件中的minsdk需要 &= 14 否则会报错~,先来看看这两个控件长什么样先,
Android 5.0后这两个控件相比以前来说好看了许多,先看下5.0前的样子:
5.0以前的ToggleButton和Switch:
好吧,鲜明的对比...接下来我们就来学习者两个控件的使用吧,其实两个的使用几乎是相同的。
开始之前贴下官方API先:;
1.核心属性讲解:
1)ToggleButton(开关按钮)
可供我们设置的属性:
android:disabledAlpha:设置按钮在禁用时的透明度
android:textOff:按钮没有被选中时显示的文字
android:textOn:按钮被选中时显示的文字
另外,除了这个我们还可以自己写个selector,然后设置下Background属性即可~
2) Switch(开关)
可供我们设置的属性:
android:showText:设置on/off的时候是否显示文字,boolean
android:splitTrack:是否设置一个间隙,让滑块与底部图片分隔,boolean
android:switchMinWidth:设置开关的最小宽度
android:switchPadding:设置滑块内文字的间隔
android:switchTextAppearance:设置开关的文字外观,暂时没发现有什么用...
android:textOff:按钮没有被选中时显示的文字
android:textOn:按钮被选中时显示的文字
android:textStyle:文字风格,粗体,斜体写划线那些
android:track:底部的图片
android:thumb:滑块的图片
android:typeface:设置字体,默认支持这三种:sans, serif,除此以外还可以使用
其他字体文件(*.ttf),首先要将字体文件保存在assets/fonts/目录下,不过需要在Java代码中设置:
Typeface typeFace =Typeface.createFromAsset(getAssets(),"fonts/HandmadeTypewriter.ttf");
textView.setTypeface(typeFace);
2.使用示例:
因为比较简单,所以我们把他们写到一起,另外,我们为Switch设置下滑块和底部的图片,实现
一个类似于IOS 7的滑块的效果,但是有个缺点就是不能在XML中对滑块和底部的大小进行设置,
就是素材多大,Switch就会多大,我们可以在Java中获得Drawable对象,然后对大小进行修改,
简单的例子:
运行效果图:
实现代码:
先是两个drawable的文件:
thumb_selctor.xml:
&?xml version="1.0" encoding="utf-8"?&
&selector xmlns:android="/apk/res/android"&
&item android:state_pressed="true" android:drawable="@drawable/switch_btn_pressed"/&
&item android:state_pressed="false" android:drawable="@drawable/switch_btn_normal"/&
&/selector&
track_selctor.xml:
&?xml version="1.0" encoding="utf-8"?&
&selector xmlns:android="/apk/res/android"&
&item android:state_checked="true" android:drawable="@drawable/switch_btn_bg_green"/&
&item android:state_checked="false" android:drawable="@drawable/switch_btn_bg_white"/&
&/selector&
布局文件:activity_main.xml:
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"&
&ToggleButton
android:id="@+id/tbtn_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:textOff="关闭声音"
android:textOn="打开声音" /&
android:id="@+id/swh_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff=""
android:textOn=""
android:thumb="@drawable/thumb_selctor"
android:track="@drawable/track_selctor" /&
&/LinearLayout&
MainActivity.java:
public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener{
private ToggleButton tbtn_
private Switch swh_
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tbtn_open = (ToggleButton) findViewById(R.id.tbtn_open);
swh_status = (Switch) findViewById(R.id.swh_status);
tbtn_open.setOnCheckedChangeListener(this);
swh_status.setOnCheckedChangeListener(this);
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
switch (compoundButton.getId()){
case R.id.tbtn_open:
if(compoundButton.isChecked()) Toast.makeText(this,"打开声音",Toast.LENGTH_SHORT).show();
else Toast.makeText(this,"打开声音",Toast.LENGTH_SHORT).show();
case R.id.swh_status:
if(compoundButton.isChecked()) Toast.makeText(this,"开关:ON",Toast.LENGTH_SHORT).show();
else Toast.makeText(this,"开关:OFF",Toast.LENGTH_SHORT).show();
2.3.6 开关按钮ToggleButton和开关Switch
记住登录状态
重复输入密码MATLAB App Designer教程连载3: 如何使用Gauge,Knob,Lamp,和Toggle Switch - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[{"sourceColumn":{"lastUpdated":,"description":"你真的了解MATLAB/Simulink吗? 来看看吧","permission":"COLUMN_PUBLIC","memberId":179747,"contributePermission":"COLUMN_PUBLIC","translatedCommentPermission":"all","canManage":true,"intro":"Do you speak MATLAB?","urlToken":"matlab","id":11659,"imagePath":"473c271b514c4f536f00dba5316faaea.jpeg","slug":"matlab","applyReason":"0","name":"MATLAB","title":"MATLAB","url":"/matlab","commentPermission":"COLUMN_ALL_CAN_COMMENT","canPost":true,"created":,"state":"COLUMN_NORMAL","followers":15455,"avatar":{"id":"473c271b514c4f536f00dba5316faaea","template":"/{id}_{size}.jpeg"},"activateAuthorRequested":false,"following":false,"imageUrl":"/473c271b514c4f536f00dba5316faaea_l.jpeg","articlesCount":73},"state":"accepted","targetPost":{"titleImage":"/a6cae0b091c231c7e5bd601f5829eafb_r.png","lastUpdated":,"imagePath":"a6cae0b091c231c7e5bd601f5829eafb.png","permission":"ARTICLE_PUBLIC","topics":[],"summary":"打开App Designer,新增的最显眼的控件就是Gauge, Knob,Lamp和Toggle Switch了,这节先学习它们的基本使用。 Gauge,Knob,Lamp和Toggle Switch在GUI中有什么用处 Gauge是仪表盘,它是一个接受外部输入,并且在GUI中显示读数的控件。在实际GUI应用中,Knob可以…","copyPermission":"ARTICLE_COPYABLE","translatedCommentPermission":"all","likes":0,"origAuthorId":0,"publishedTime":"T11:11:49+08:00","sourceUrl":"","urlToken":,"id":521919,"withContent":false,"slug":,"bigTitleImage":false,"title":"MATLAB App Designer教程连载3: 如何使用Gauge,Knob,Lamp,和Toggle Switch","url":"/p/","commentPermission":"ARTICLE_ALL_CAN_COMMENT","snapshotUrl":"","created":,"comments":0,"columnId":11659,"content":"","parentId":0,"state":"ARTICLE_PUBLISHED","imageUrl":"/a6cae0b091c231c7e5bd601f5829eafb_r.png","author":{"bio":"I build MATLAB","isFollowing":false,"hash":"77a80b5ae15b3e894e29fa7","uid":791100,"isOrg":false,"slug":"iamxuxiao","isFollowed":false,"description":"MATLAB kernel developer
","name":"iamxuxiao","profileUrl":"/people/iamxuxiao","avatar":{"id":"v2-7bb86fe76c82aa69196cbe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"memberId":,"excerptTitle":"","voteType":"ARTICLE_VOTE_CLEAR"},"id":357359}],"title":"MATLAB App Designer教程连载3: 如何使用Gauge,Knob,Lamp,和Toggle Switch","author":"iamxuxiao","content":"打开App Designer,新增的最显眼的控件就是Gauge, Knob,Lamp和Toggle Switch了,这节先学习它们的基本使用。Gauge,Knob,Lamp和Toggle Switch在GUI中有什么用处Gauge是仪表盘,它是一个接受外部输入,并且在GUI中显示读数的控件。在实际GUI应用中,Knob可以用来显示MATLAB从外界搜集的模拟(Analog)的或者数字(Digital)的信号。Knob控件有两种旋钮,它们是输出控件,可以输出类似Analog或者Digital信号,在实际GUI应用中,Knob用来控制外部硬件输入。Switch也是输出装置,它对应现实中的按钮。Switch只有两个状态:开和关。在实际GUI应用中,Switch可以用来控制外部硬件的状态。如何利用Gauge,Knob,Lamp和Toggle Switch设计一个简单的APP本节为了简单起见,仅仅构造一个假想的APP:用Knob的输出来控制Gauge的读数,用Switch来控制Lamp的颜色在下节教程中,我们将举一个更实际的MATLAB App Designer和硬件结合的例子。本例的设计如下:首先拖拽两个Panel,命名如图。 从用户体验的角度出发,在GUI上进行明显的分组可以帮助用户理解控件的用处 从视觉上可以看出,Gauge和Knob是相互关联的控件,而Toggle Switch和Lamp是相互关联。并且注意到,这里修改了Lamp的初值颜色为黑色,表示当开关的状态是'关'时,灯是黑色的。如果修改属性的初值在中 曾经提到过:需要在Code View tab中,在Component Browser中点选对应的控件,然后在Property Browser中寻找可以允许修改的属性,如图:如何用Knob控制Gauge,用Toggle Switch 控制Lamp简单起见,不再修改类定义中属性的名字。直接给Knob添加ValueChanged的回调函数在其回调函数中,直接把得到的Knob的值再赋给Gauge,达到控制仪表盘的目的 :function KnobValueChanged(app)\n
value = app.Knob.V\n
app.Gauge.Value =\nend\n接下来再给ToogleSwitch添加回调函数:在其回调函数中,比较ToggleSwitch的属性Value,如果是'On',则把Lamp的颜色改成红色,否则设成黑色:function ToggleSwitchValueChanged(app)\n
value = app.ToggleSwitch.V\n
if strcmp(value,'On')\n
app.Lamp.Color = [1,0,0] ; \n
app.Lamp.Color = [0,0,0];\n
end\nend\n最后实际效果如下,鼠标把Knob的值拖动到16,Gauge的值随即也改到16;点击Toggle Switch成为On状态,Lamp的颜色变成红色。本节的例子仅为了简单说明Knob,Gauage,Toggle Swith和Lamp的简单使用,下节中我们将把这些控件和实际的硬件结合起来。","updated":"T03:11:49.000Z","canComment":false,"commentPermission":"anyone","commentCount":5,"collapsedCount":0,"likeCount":18,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","titleImage":"/a6cae0b091c231c7e5bd601f5829eafb_r.png","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[{"url":"/topic/","id":"","name":"MATLAB"},{"url":"/topic/","id":"","name":"面向对象编程"}],"adminClosedComment":false,"titleImageSize":{"width":411,"height":420},"href":"/api/posts/","excerptTitle":"","column":{"slug":"matlab","name":"MATLAB"},"tipjarState":"inactivated","annotationAction":[],"sourceUrl":"","pageCommentsCount":5,"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T11:11:49+08:00","url":"/p/","lastestLikers":[{"bio":"工科本科生","isFollowing":false,"hash":"86e9ec393dfffed98b42ea41","uid":515100,"isOrg":false,"slug":"qiu-xu-3-61","isFollowed":false,"description":"","name":"秋绪","profileUrl":"/people/qiu-xu-3-61","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"心怀猛虎 细嗅蔷薇","isFollowing":false,"hash":"f1f5e4f9fe6e0da5588e","uid":761700,"isOrg":false,"slug":"zhang-xin-yan-94-56","isFollowed":false,"description":"","name":"荷叶猫","profileUrl":"/people/zhang-xin-yan-94-56","avatar":{"id":"v2-408bdda2924dab98b5fc4eb92dcd4e8b","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"数字化建筑设计建造和人工智障/暖通攻城狮","isFollowing":false,"hash":"02a3e3f3bb3f4b4bce7af","uid":268200,"isOrg":false,"slug":"huang-chen-yu-33","isFollowed":false,"description":"合山建筑景观工作室\n\n目前在跨界研究基于定域纠缠态的量子超距传送(Quantum Teleportation Based on Local Hidden Variable & Entangled State)期待完全取代传统交通工具在时间空间上的暧昧状态","name":"辰宇","profileUrl":"/people/huang-chen-yu-33","avatar":{"id":"72bb9fd91ac8d16ee1ce6a9c3d6bbdc3","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"化工硕士在读","isFollowing":false,"hash":"d97a5a29a71b089d595acc8","uid":376500,"isOrg":false,"slug":"yan-hua-bu-leng-3","isFollowed":false,"description":"I AM A PREDATOR","name":"烟花不冷","profileUrl":"/people/yan-hua-bu-leng-3","avatar":{"id":"v2-edc79ea6c6db","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"学生一枚","isFollowing":false,"hash":"1dfbfbe8f9a","uid":822700,"isOrg":false,"slug":"yan-fang-15-53","isFollowed":false,"description":"","name":"严荒","profileUrl":"/people/yan-fang-15-53","avatar":{"id":"9f3cf9ded15ae1a1d9e7","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"打开App Designer,新增的最显眼的控件就是Gauge, Knob,Lamp和Toggle Switch了,这节先学习它们的基本使用。 Gauge,Knob,Lamp和Toggle Switch在GUI中有什么用处 Gauge是仪表盘,它是一个接受外部输入,并且在GUI中显示读数的控件。在实际GUI应用中,Knob可以…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/4eaba1ca5be3b5b474a3fd9b6b90d88f_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"MATLAB"},{"url":"/topic/","id":"","name":"面向对象编程"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"I build MATLAB","isFollowing":false,"hash":"77a80b5ae15b3e894e29fa7","uid":791100,"isOrg":false,"slug":"iamxuxiao","isFollowed":false,"description":"MATLAB kernel developer
","name":"iamxuxiao","profileUrl":"/people/iamxuxiao","avatar":{"id":"v2-7bb86fe76c82aa69196cbe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"matlab","name":"MATLAB"},"content":"本节接着 , 解读App Designer自动生成的面向对象代码中的内容。App属性声明的语法为什么和以前的不一样沿用教程1中的例子,由App Designer生成MyBalanceApp类的属性如下,它们都是用户在DesignView中拖拽到画布上的控件,并且我们教程1中修改了部分属性的名称:还需要注意到,这里属性声明的语法,和 (出版于2015年1月)中介绍的属性声明有些不同,书中介绍的语法格式是:properties\n
propName\nend\n而这里的语法格式在propName后面多了一部分:properties\n
propName propType\nend\n这是因为,在最新的R2016a中,MATLAB的面向对象系统专门引入新的可选(Optional)属性声明。这就是说, 如果有需要 ,类的设计者可指定属性的种类。比如我们把myprop的属性指定成double.classdef MyClass\n
properties\n\tmyprop
end\nend\n那么在赋值给对象属性赋值的时候,也必须指定其值的类型是double scalar,如果尝试要给它赋其它种类的值,MATLAB将报错:&& o
= MyC\n&& o.myprop = {1,2}\nWhile setting the 'myprop' property of 'MyClass':\nThe following error occurred converting from cell to double:\nConversion to double from cell is not possible.\n而在这个功能发布之前,类的设计者需要通过set函数来实现对类的属性的限制,详见书第2.8节App的构造函数中做了哪些事情在App Designer生成的MyBalanceApp类中,构造函数包括以下工作 该方法在Code View中是灰色的,表示不支持直接修改。第一步 调用createComponents方法createComponents是定义在MyBalanceApp类中的一个private方法,只能从类的内部进行调用。它相当于MVC模式中,View类的初始化工作,内容包括:生成figure对象当做画布,figure尺寸大小来自于Design View中的设计生成Design View中用户指定的各个控件,初始化它们的大小,部分初值和在figure中的位置methods (Access = private)\n
function createComponents(app)\n\tapp.UIFigure =\n\tapp.UIFigure.Position = [100 100 212 152];\n\tapp.UIFigure.Name = 'UI Figure';\n\tsetAutoResize(app, app.UIFigure, true)\n... 以下省略 ...\n该方法在Code View中是灰色的,表示不支持直接修改。第二步 调用registerApp方法registerApp方法继承自MyBalanceApp的基类matlab.apps.AppBase% Register the app with App Designer\nregisterApp(app, app.UIFigure)\n该方法把app对象中的UIFigure属性,作为reference传给基类去注册自己,工作包括:给UIFigure添加一个动态属性,该动态属性反过来指向app本身,这样UIFigure也拥有指向app的handle把MyBalanceApp的析构函数设置成关闭GUI窗口的回调函数,这样关闭GUI窗口的时候,会触发MATLAB关闭UIFigure注册一些其它的回调函数该方法在Code View中是灰色的,表示不支持直接修改。第三步 调用runStartupFcn方法该方法是MyBalanceApp中定义的一个public方法,该方法的框架由App Designer生产,由用户自行添加需要的内容。作用包括一些额外的初始化工作。比如在账户提款存款的例子中,我们需要在GUI刚开始的时候,一些栏目中就可以显示一些初始值,于是我们需要修改runStartupFcn如下:function startupFcn(app)\n
app.Balance = 500;\n
app.ViewRMB.Value = 0 ;\n
app.ViewBalance.Value = app.B\nend\nApp的析构函数在何时被调用MyBalanceApp的析构函数的内容是关闭GUI的Figure,该函数是点击GUI的关闭窗口按钮时的回调函数,于是GUI的窗口被关闭将触发该方法,关闭MATLAB的UIFigure。% Code that executes before app deletion\nfunction delete(app)\n
% Delete UIFigure when app is deleted\n
delete(app.UIFigure)\nend\n如何得到AppDesigner生成的代码教程1中提到,本Tutorial的顺序是先介绍使用App Designer提供的拖拽的方式GUI编程,然后再进阶介绍如何用纯程序的方式结合App Designer进行GUI编程。如果要使用纯程序的方式,我们需要得到App Designer帮我们生成的代码,但App Designer保存之后是一个后缀为mpapp的文件,该如何打开得到其中的代码呢?有几种办法,最简单的就是在App Designer的Code View中按下 Ctrl + A,选定所有的代码,然后Ctrl + C,这样就把所有的代码赋值到剪贴板了。读者可以做一个实验,假设你给App起的名字叫做MyBalanceApp, 那么App Designer帮你自动生成的类的名字也叫做MyBalanceApp, 读者可以在任意目录中,新建一个M文件叫做MyBalanceApp,把拷贝出来的代码粘贴进去,然后在命令行中声明一个该类的对象&& myBalanceApp\n我们将看到,一个一摸一样的GUI产生了,并且每个Button所执行的功能都和原来一样!这将是我们后续介绍App Designer和MVC模式结合的基础。","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T21:56:52+08:00","url":"/p/","title":"MATLAB App Desinger教程连载2:详解App Designer生成的代码","summary":"本节接着 , 解读App Designer自动生成的面向对象代码中的内容。 App属性声明的语法为什么和以前的不一样沿用教程1中的例子,由App Designer生成MyBalanceApp类的属性如下,它们都是用户在DesignView中拖拽到画布上的控件,并且我们教程1中修改了部分属…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":1,"likesCount":18},"next":{"isTitleImageFullScreen":true,"rating":"none","titleImage":"/50/9ee1b930e6b_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[{"url":"/topic/","id":"","name":"MATLAB"},{"url":"/topic/","id":"","name":"数据可视化"}],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"Control","isFollowing":false,"hash":"5fb17c40aad80a8e177314","uid":88,"isOrg":false,"slug":"bertJ","isFollowed":false,"description":"Computer Vision","name":"波特","profileUrl":"/people/bertJ","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},"column":{"slug":"matlab","name":"MATLAB"},"content":"老板:myc你还想不想转正了??myc:我只是去过五一长假了而已……老板:骗鬼呢?五一早就不放7天了好吗,App Designer都快写完了,你不想转正人家就要上位了myc:人家已经是老员工了……老板:再不写就开除myc:……myc这就把他呕心沥血的难产产物献给大家……我们在讲Graph的文章中生成了一个专栏462名关注者的关系图。然而有句古话说的好Code is cheap, show me the plot.好在MATLAB新的Graph类自带了plot的函数h
= plot(subsG);\n这就是我们462个关注者及每个关注者的关注者的关系图。在人际关系图中,force graph更能体现出每个节点的重要性。我们来改变当前图的结构h.layout('force')\n放大看看是不是好一点?并没有……主要是数据太多,都乌压压地在一起了。这里有5万多个节点,肯定看起来不方便。我们回到数据,想想最重要的是什么?不就是我们专栏忠实的关注者吗?于是我们取出这462位关注者,建立子图。在MATLAB中可以很方便的用subgraph功能从图中剥离出子图。realFollower = subsG.findnode(ids);\nfollowerGraph = subgraph(subsG,realFollower)\nfollowerGraph = \n\n
digraph with properties:\n\n
Edges: [990×1 table]\n
Nodes: [462×3 table]\n\nhsub = plot(followerGraph,'layout','force')\n现在再来看看这462位关注者之间的关系,是不是比之前的清晰很多?然而我们还可以做的更好。我们的数据是多维的,比如每个关注者有自己的粉丝,如何在一个2维的图上显示出这个信息呢?我们可以用每个节点的大小来代表他/她的粉丝数hsub.MarkerSize = log(str2double(followerGraph.Nodes.Weight)+1.1)*2;\n看起来不错,如果同时把节点的颜色变成他/她的粉丝数呢?hsub.NodeCData=str2double(followerGraph.Nodes.Weight);\n瞬间变的清晰明了了有没有?突出一个大V然而myc很快的意识到,粉丝数的多少对于专栏来说并没有什么大用。倒是一个关注者在专栏内有多少个其他关注者粉丝是个很有意思的数据。我们用图的入度indegree来表示一个节点有多少个粉丝。hsub.NodeCData=indegree(followerGraph);\n我们可以看到,之前的大V节点在专栏内其实并不是有最多“朋友”的。当然本来粉丝就少的关注者在专栏内也不会有很多粉丝。我们来看看到底是谁在专栏内有最多的关注者。我们进入datacursor模式。点击最黄的那个节点hd = datacursormode;\n在专栏内有93个粉丝哟,几乎占了462人的20%。很大程度上可以说有20%的人都是因为他/她而关注MATLAB专栏的。但是默认的datatip给出的信息太生肉了,还带着那个不是给人看的id。我们来写一个自己的显示datatip的方式hd.UpdateFcn = @(obj,event_obj) GraphCursorCallback(obj,event_obj,followerGraph);\n在回调函数中,显示当前节点的名字,粉丝数,和专栏中的粉丝数function output_txt = GraphCursorCallback(obj,event_obj,g)\n% Display the position of the data cursor\n% obj
Currently not used (empty)\n% event_obj
Handle to event object\n% output_txt
Data cursor text (character vector or cell array of character vectors).\n\nh = get(event_obj,'Target');\npos = get(event_obj,'Position');\nind = find(h.XData == pos(1) & h.YData == pos(2), 1);\n\noutput_txt = {g.Nodes.uName{ind},['Follower ',g.Nodes.Weight{ind}],['Friend in subscriber ',num2str(indegree(g,ind))]};\nend\n再点击那个节点看看,原来是 ,他自己有1000+的粉丝,在专栏中有93个粉丝,说明他粉丝中至少10%的人是和他在MATLAB上有交集的(大概MATLAB的GraphPlot类还提供了方便的高亮功能,比如我们想看我们的第一位关注者 老师在专栏中的粉丝图。s= findedge(followerGraph,predecessors(followerGraph,1),1);\nhsub.highlight(followerGrap\nh.Edges.EndNodes(s,1),followerGraph.Edges.EndNodes(s,2),'EdgeColor','r');\n红线连起来的就是 老师魔爪伸向的地方……有了Graph类方便的可视化系统,我们就可以利用MATLAB做一些很有趣的事情比如查看我们的专栏是如何一步步走到今天的。还记得我们在里面建立的关注者追踪系统吗?我们可以通过 来获取专栏关注的实时人数,并把他们的关系图画出来。下面就展示了一个非常简单的动画效果。老板:动画做的不错啊myc,不愧是当年学美术的myc:?????老板:非常满意,从今天开始你就是我们的正式员工了myc:等这一天好久了……老板:来,送你个礼物myc:这么好!I am excited!是啥是啥??myc:……后面那个花花袋子是什么鬼老板:要好好工作哦myc:好……谢…………等等,为什么只有一个手柄????电源呢??还有……这尼玛让我接哪个显示器??-以此纪念转正的俄罗斯实习生myc还有从专栏开通1个多月来默默支持我们的近700名关注者","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T09:14:10+08:00","url":"/p/","title":"MATLAB Graph Object(3): 展示关系网","summary":"老板:myc你还想不想转正了?? myc:我只是去过五一长假了而已…… 老板:骗鬼呢?五一早就不放7天了好吗,App Designer都快写完了,你不想转正人家就要上位了 myc:人家已经是老员工了…… 老板:再不写就开除 myc:…… myc这就把他呕心沥血的难产产物献…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":13,"likesCount":55}},"annotationDetail":null,"commentsCount":5,"likesCount":18,"FULLINFO":true}},"User":{"iamxuxiao":{"isFollowed":false,"name":"iamxuxiao","headline":"MATLAB kernel developer
","avatarUrl":"/v2-7bb86fe76c82aa69196cbe_s.jpg","isFollowing":false,"type":"people","slug":"iamxuxiao","bio":"I build MATLAB","hash":"77a80b5ae15b3e894e29fa7","uid":791100,"isOrg":false,"description":"MATLAB kernel developer
","profileUrl":"/people/iamxuxiao","avatar":{"id":"v2-7bb86fe76c82aa69196cbe","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","appStoreRateDialog":"close","nwebStickySidebar":"sticky","qrcodeLogin":"qrcode","favAct":"default","default":"None","mobileQaPageProxyHeifetz":"m_qa_page_nweb","newMore":"new","iOSNewestVersion":"4.2.0","newMobileColumnAppheader":"new_header","sendZaMonitor":"true","homeUi2":"default","answerRelatedReadings":"qa_recommend_by_algo_related_with_article","wechatShareModal":"wechat_share_modal_show","liveReviewBuyBar":"live_review_buy_bar_2","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b","liveStore":"ls_a2_b2_c1_f2","zcmLighting":"zcm"}},"columns":{"next":{},"matlab":{"following":false,"canManage":false,"href":"/api/columns/matlab","name":"MATLAB","creator":{"slug":"bertJ"},"url":"/matlab","slug":"matlab","avatar":{"id":"473c271b514c4f536f00dba5316faaea","template":"/{id}_{size}.jpeg"}}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}

我要回帖

更多关于 toggle switch sw102 的文章

 

随机推荐