在Android平台上比拟有特征的就是ToggleButton控件,固然它的功用和CheckBox有些相似,但是他们的用途还是有一定的区别比方ToggleButton本来有图片装饰,经过ToggleButton能够很分明的显现某些状态。它们均从Button为基类的CompoundButton中完成,其真假事情从Checkable来完成。
publicabstractclassCompoundButtonextendsButtonimplementsCheckable{
privatebooleanmChecked;//状态能否选中
privateintmButtonResource;
privatebooleanmBroadcasting;
privateDrawablemButtonDrawable;//按钮的图标
privateOnCheckedChangeListenermOnCheckedChangeListener;//选中状态改动监听

privateOnCheckedChangeListenermOnCheckedChangeWidgetListener;
privatestaticfinalint[]CHECKED_STATE_SET={
R.attr.state_checked
};
publicCompoundButton(Contextcontext){
this(context,null);
}
publicCompoundButton(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicCompoundButton(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
TypedArraya=context.obtainStyledAttributes(attrs,com.android.internal.R.styleable.CompoundButton,
defStyle,0);
Drawabled=a.getDrawable(com.android.internal.R.styleable.CompoundButton_button);
if(d!=null){
setButtonDrawable(d);
}
booleanchecked=a.getBoolean(com.android.internal.R.styleable.CompoundButton_checked,false);
setChecked(checked);
a.recycle();//显式的GC
}
publicvoidtoggle(){
setChecked(!mChecked);
}
@Override
publicbooleanperformClick(){
toggle();
returnsuper.performClick();
}
publicbooleanisChecked(){
returnmChecked;
}
publicvoidsetChecked(booleanchecked){
if(mChecked!=checked){
mChecked=checked;
refreshDrawableState();//更新当前状态的按钮图标
if(mBroadcasting){
return;
}
mBroadcasting=true;
if(mOnCheckedChangeListener!=null){
mOnCheckedChangeListener.onCheckedChanged(this,mChecked);
}
if(mOnCheckedChangeWidgetListener!=null){
mOnCheckedChangeWidgetListener.onCheckedChanged(this,mChecked);
}
mBroadcasting=false;
}
}
publicvoidsetOnCheckedChangeListener(OnCheckedChangeListenerlistener){
mOnCheckedChangeListener=listener;
}
voidsetOnCheckedChangeWidgetListener(OnCheckedChangeListenerlistener){
mOnCheckedChangeWidgetListener=listener;
}
publicstaticinterfaceOnCheckedChangeListener{
voidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked);
}
publicvoidsetButtonDrawable(intresid){
if(resid!=0&&resid==mButtonResource){
return;
}
mButtonResource=resid;
Drawabled=null;
if(mButtonResource!=0){
d=getResources().getDrawable(mButtonResource);
}
setButtonDrawable(d);
}
publicvoidsetButtonDrawable(Drawabled){
if(d!=null){
if(mButtonDrawable!=null){
mButtonDrawable.setCallback(null);
unscheduleDrawable(mButtonDrawable);
}
d.setCallback(this);
d.setState(getDrawableState());
d.setVisible(getVisibility()==VISIBLE,false);
mButtonDrawable=d;
mButtonDrawable.setState(null);
setMinHeight(mButtonDrawable.getIntrinsicHeight());
}
refreshDrawableState();
}
@Override
publicbooleandispatchPopulateAccessibilityEvent(AccessibilityEventevent){
booleanpopulated=super.dispatchPopulateAccessibilityEvent(event);
if(!populated){
intresourceId=0;
if(mChecked){
resourceId=R.string.accessibility_compound_button_selected;
}else{
resourceId=R.string.accessibility_compound_button_unselected;
}
Stringstate=getResources().getString(resourceId);
event.getText().add(state);
event.setChecked(mChecked);
}
returnpopulated;
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
finalDrawablebuttonDrawable=mButtonDrawable;
if(buttonDrawable!=null){
finalintverticalGravity=getGravity()&Gravity.VERTICAL_GRAVITY_MASK;
finalintheight=buttonDrawable.getIntrinsicHeight();
inty=0;
switch(verticalGravity){
caseGravity.BOTTOM:
y=getHeight()-height;
break;
caseGravity.CENTER_VERTICAL:
y=(getHeight()-height)/2;
break;
}
buttonDrawable.setBounds(0,y,buttonDrawable.getIntrinsicWidth(),y+height);
buttonDrawable.draw(canvas);
}
}
@Override
protectedint[]onCreateDrawableState(intextraSpace){
finalint[]drawableState=super.onCreateDrawableState(extraSpace+1);
if(isChecked()){
mergeDrawableStates(drawableState,CHECKED_STATE_SET);
}
returndrawableState;
}
@Override
protectedvoiddrawableStateChanged(){//android123提示状态改动时需求改换按钮的图标
super.drawableStateChanged();
if(mButtonDrawable!=null){
int[]myDrawableState=getDrawableState();
mButtonDrawable.setState(myDrawableState);
invalidate();
}
}
@Override
protectedbooleanverifyDrawable(Drawablewho){
returnsuper.verifyDrawable(who)||who==mButtonDrawable;
}
staticclassSavedStateextendsBaseSavedState{
booleanchecked;
SavedState(ParcelablesuperState){
super(superState);
}
privateSavedState(Parcelin){
super(in);
checked=(Boolean)in.readValue(null);
}
@Override
publicvoidwriteToParcel(Parcelout,intflags){
super.writeToParcel(out,flags);
out.writeValue(checked);
}
@Override
publicStringtoString(){
return”CompoundButton.SavedState{”
+Integer.toHexString(System.identityHashCode(this))
+”checked=”+checked+”}”;
}
publicstaticfinalParcelable.CreatorCREATOR=newParcelable.Creator(){
publicSavedStatecreateFromParcel(Parcelin){
returnnewSavedState(in);
}
publicSavedState[]newArray(intsize){
returnnewSavedState[size];
}
};
}
@Override
publicParcelableonSaveInstanceState(){
//Forceourancestorclasstosaveitsstate
setFreezesText(true);
ParcelablesuperState=super.onSaveInstanceState();
SavedStatess=newSavedState(superState);
ss.checked=isChecked();
returnss;
}
@Override
publicvoidonRestoreInstanceState(Parcelablestate){
SavedStatess=(SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
setChecked(ss.checked);
requestLayout();
}
}
从上面来看我们晓得CompuundButton的完成相对繁琐了些,主要是思索状态能否曾经选中等状况的音讯通知,Android
开发网提示大家而ToggleButton相对CompuundButton增加的给用户而言主要是开关的文字显现。
publicclassToggleButtonextendsCompoundButton{
privateCharSequencemTextOn;
privateCharSequencemTextOff;
privateDrawablemIndicatorDrawable;
privatestaticfinalintNO_ALPHA=0xFF;
privatefloatmDisabledAlpha;
publicToggleButton(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
TypedArraya=context.obtainStyledAttributes(
attrs,com.android.internal.R.styleable.ToggleButton,defStyle,0);
mTextOn=a.getText(com.android.internal.R.styleable.ToggleButton_textOn);
mTextOff=a.getText(com.android.internal.R.styleable.ToggleButton_textOff);
mDisabledAlpha=a.getFloat(com.android.internal.R.styleable.ToggleButton_disabledAlpha,0.5f);
syncTextState();
a.recycle();
}
publicToggleButton(Contextcontext,AttributeSetattrs){
this(context,attrs,com.android.internal.R.attr.buttonStyleToggle);
}
publicToggleButton(Contextcontext){
this(context,null);
}
@Override
publicvoidsetChecked(booleanchecked){
super.setChecked(checked);
syncTextState();
}
privatevoidsyncTextState(){
booleanchecked=isChecked();
if(checked&&mTextOn!=null){
setText(mTextOn);
}elseif(!checked&&mTextOff!=null){
setText(mTextOff);
}
}
publicCharSequencegetTextOn(){
returnmTextOn;
}
publicvoidsetTextOn(CharSequencetextOn){
mTextOn=textOn;
}
publicCharSequencegetTextOff(){
returnmTextOff;
}
protectedvoidonFinishInflate(){
super.onFinishInflate();
updateReferenceToIndicatorDrawable(getBackground());
}
@Override
publicvoidsetBackgroundDrawable(Drawabled){
super.setBackgroundDrawable(d);
updateReferenceToIndicatorDrawable(d);
}
privatevoidupdateReferenceToIndicatorDrawable(DrawablebackgroundDrawable){
if(backgroundDrawableinstanceofLayerDrawable){
LayerDrawablelayerDrawable=(LayerDrawable)backgroundDrawable;
mIndicatorDrawable=layerDrawable.findDrawableByLayerId(com.android.internal.R.id.toggle);
}
}
@Override
protectedvoiddrawableStateChanged(){
super.drawableStateChanged();
if(mIndicatorDrawable!=null){
mIndicatorDrawable.setAlpha(isEnabled()?NO_ALPHA:(int)(NO_ALPHA*mDisabledAlpha));
}
}
}

1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com