滚动1u等于多少厘米

1u等于多少厘米  时间:2021-04-22  阅读:()
14566666777778888888999910101010101111111212121213131414141515151616171718目录目录目录.
gitignoreHomeQMUI-Q-&-A1.
编译时提示QDWidgetContainter不存在2.
依赖包冲突3.
能不能不使用QMUI提供的Theme4.
直接从Github下载zip文件,项目不能运行,出现诸如Error:(4,0)Forinputstring:""之类的错误QMUI-alpha-widgetsxml属性主要方法使其他View支持alpha功能相关类QMUI-round-widgetsxml属性在Java中修改按钮样式注意使其他View支持圆角功能QMUIRoundButton全局配置组件样式的示例相关类QMUI-学习资源教程AndroidUI实用小Tip集合原理解析QMUIAlphaViewHelper主要方法使View支持在点击(pressed)和不可用(disabled)时改变alpha全局配置pressed和disabled时的alpha值相关类QMUIContinuousNestedScrollLayout使用1.
提供TopView2.
提供BottomView3.
将TopView/BottomView赋值给QMUIContinuousNestedScrollLayoutscroll支持触发scrollscroll监听滚动位置恢复与还原QMUIDialog基类Builder及其提供的通用方法对话框按钮常见的对话框类型消息类型对话框带CheckBox的消息确认框带输入框的对话框菜单类型的对话框单选菜单类型的对话框多选菜单类型的对话框自定义对话框目录1/471820202020212121212222222323232424242425262627272828292929303030303031323232323333333434343435353637全局配置QMUIDialog样式QMUIEmptyView效果图xml属性主要方法QMUIFloatLayout效果图xml属性主要方法QMUIRoundButtonDrawable主要方法通过View的xml属性构造QMUIRoundButtonDrawable,使View支持圆角功能xml属性注意相关类QMUIStickySectionLayout使用1.
通过XML或Java代码构造QMUIStickySectionLayout实例:2.
准备好数据模型3.
实现Adapter4.
关联QMUIStickySectionLayout与它的相关类关于index折叠与展开、滚动定位加载更多自定义扩展1.
在Adapter里重写createDiffCallback返回自定义的QMUISectionDiffCallback:2.
在Adapter里重写getCustomItemViewType做多viewType处理3.
onCreateCustomItemViewHolder/onBindCustomItem4.
数据更新QMUITopBar效果图xml属性全局配置组件样式的示例主要方法相关类QMUITopBarLayoutQMUITopBarLayout在沉浸式状态栏中的作用使用示例相关类QMUIVerticalTextView效果图主要方法_Sidebar组件文档全局配置其他帮助imagesQMUIDialog_checkablemenuQMUIDialog_checkboxmessageQMUIDialog_edittext目录2/47383940414243444546QMUIDialog_menuQMUIDialog_messageQMUIDialog_multicheckablemenuQMUIEmptyViewQMUIFloatLayoutQMUITopBar_1QMUIVerticalTextView提供-Layout-Inspector-文件组件的全局配置与特殊处理目录3/47/*.
bin*.
iml.
DS_Store/.
gradle/.
gradletasknamecache/.
idea/bin/build/local.
properties/captures.
gitignore.
gitignore.
gitignore4/47WelcometotheQMUI_Androidwiki!
HomeHomeHome5/47QDWidgetContainter在QDDataManager中被使用到,它是通过java注解功能在编译时动态生成的,是为了给QD项目提供展示所需的QMUI组件信息.
部分人员在拷贝QD项目中的代码时会带上QDDataManager相关的代码,不管是有心还是无意,都是不应该的.
QMUI内部会依赖support包,而一般项目也会引入support包,这难免会出现support版本冲突.
gradle有提供版本冲突的解决措施,所以在项目中添加如下代码即可:configurations.
all{resolutionStrategy{force"com.
android.
support:recyclerview-v7:$supportVersion"force"com.
android.
support:appcompat-v7:$supportVersion"force"com.
android.
support:design:$supportVersion"force"com.
android.
support:support-vector-drawable:$supportVersion"}}因为QMUI里的很多控件都依赖theme,所以要求AppTheme的parent是QMUI.
Compat(或QMUI,不推荐).
使用这2个theme本质上是为了给QMUI自定义的attr赋值.
如果你有使用自己主题的需求,目前可以使用你自己的主题,然后将qmui_themes_compat.
xml文件中的里的item拷到自己的主题中,以保证依赖theme的控件能正常工作.
QMUIDemo的versionCode是通过gitVersion控制的.
如果通过gitclone获取源码,则可以正常编译;如果直接下载Github打包的zip文件,则需要修改qmuidemo/build.
gradle文件,写死一个gitVersionQMUI-Q-&-AQMUI-Q-&-A1.
编译时提示QDWidgetContainter不存在1.
编译时提示QDWidgetContainter不存在2.
依赖包冲突2.
依赖包冲突3.
能不能不使用QMUI提供的Theme3.
能不能不使用QMUI提供的Theme4.
直接从Github下载zip文件,项目不能运行,出现诸如4.
直接从Github下载zip文件,项目不能运行,出现诸如Error:(4,0)Forinputstring:""之类的错误之类的错误QMUI-Q-%26-A6/47QMUIalphawidgets是一套提供了在点击(pressed)和不可用(disabled)时改变alpha功能的控件,包括:QMUIAlphaButtonQMUIAlphaFrameLayoutQMUIAlphaLinearLayoutQMUIAlphaRelativeLayoutQMUIAlphaImageButtonQMUIAlphaTextView属性名属性名描述描述qmui_alpha_pressed点击时的透明度(0~1)qmui_alpha_disabled不可用时的透明度(0~1)方法名方法名描述描述setChangeAlphaWhenPress(booleanchangeAlphaWhenPress)设置是否要在pressed时改变透明度setChangeAlphaWhenDisabled(booleanchangeAlphaWhenPress)设置是否要在disabled时改变透明度通过简单的方式,可以使任何View支持alpha功能,参考QMUIAlphaViewHelperQMUIAlphaViewHelperQMUI-alpha-widgetsQMUI-alpha-widgetsxml属性xml属性主要方法主要方法使其他View支持alpha功能使其他View支持alpha功能相关类相关类QMUI-alpha-widgets7/47QMUIroundwidgets是一套提供了圆角功能的控件,包括:QMUIRoundButtonQMUIRoundFrameLayoutQMUIRoundLinearLayoutQMUIRoundRelativeLayout这些widgets都支持圆角功能,其内部是通过将QMUIRoundButtonDrawable作为background来实现,支持的xml属性见QMUIRoundButtonDrawable.
各个属性的默认样式配置见qmui_style_widget.
xml因为这些widgets的圆角功能是通过将QMUIRoundButtonDrawable作为background来实现,所以修改样式时需要获取到其background来做修改.
例:QMUIRoundButtonbutton=newQMUIRoundButton(getContext());QMUIRoundButtonDrawableroundButtonDrawable=(QMUIRoundButtonDrawable)button.
getBackground();//再对roundButtonDrawable设置样式具体支持的方法见QMUIRoundButtonDrawable因为该控件的圆角采用View的background实现,所以与原生的android:background有冲突.
通过简单的方式,可以使任何View支持圆角功能,参考QMUIRoundButtonDrawableQMUIRoundButton作为最常用的roundwidget,可在主题中配置它的样式,就能全局生效.
@style/YourStyle@color/your_color_or_colorstatelistQMUIRoundButtonDrawableQMUI-round-widgetsQMUI-round-widgetsxml属性xml属性在Java中修改按钮样式在Java中修改按钮样式注意注意使其他View支持圆角功能使其他View支持圆角功能QMUIRoundButton全局配置组件样式的示例全局配置组件样式的示例相关类相关类QMUI-round-widgets8/47AndroidTheme的使用http://cgsdream.
org/recordtag=598a653b8a43164218ddcc88教你自定义android中span玩转Android嵌套滚动Android沉浸式状态栏必知必会TextView文本高亮与点击行为完美封装QMUI-学习资源QMUI-学习资源教程教程AndroidUI实用小Tip集合AndroidUI实用小Tip集合原理解析原理解析QMUI-学习资源9/47QMUIAlphaViewHelper是一个工具类,通过结合该工具类,View能支持在点击(pressed)和不可用(disabled)时改变整体的alpha值.
方法名方法名描述描述setChangeAlphaWhenPress(booleanchangeAlphaWhenPress)设置是否要在pressed时改变透明度setChangeAlphaWhenDisabled(booleanchangeAlphaWhenPress)设置是否要在disabled时改变透明度onPressedChanged(Viewcurrent,booleanpressed)通知helper更新状态,在需要支持alpha的View的setPressed(boolean)中调用onEnabledChanged(Viewcurrent,booleanenabled)通知helper更新状态,在需要支持alpha的View的setEnabled(boolean)中调用通过以下简单的步骤,可以使任何View支持alpha功能.
1.
在View中添加成员变量QMUIAlphaViewHelper2.
使View实现QMUIAlphaWidgetInf接口,其中的setChangeAlphaWhen***方法里直接调用步骤1里的QMUIAlphaViewHelper的相应方法即可.
3.
在View的setPressed(booleanpressed)和setEnabled(booleanenabled)方法中,调用步骤1里的QMUIAlphaViewHelper的onPressedChanged(Viewcurrent,booleanpressed)和onEnabledChanged(Viewcurrent,booleanenabled)方法.
可参考QMUIAlphaTextView通过在App的theme中覆盖以下属性,可在全局范围内配置pressed和disabled的alpha值:0.
60.
6QMUIalphawidgetsQMUIAlphaViewHelperQMUIAlphaViewHelper主要方法主要方法使View支持在点击(pressed)和不可用(disabled)时改变alpha使View支持在点击(pressed)和不可用(disabled)时改变alpha全局配置pressed和disabled时的alpha值全局配置pressed和disabled时的alpha值相关类相关类QMUIAlphaViewHelper10/47QMUI版本要求:v1.
3.
2+QMUIContinuousNestedScrollLayout,用于连接两个上下滚动的容器,使他们能够连续滚动.
例如一个WebView用于显示网页内容,一个RecyclerView用于显示评论.
在QMUI里,把上面的滚动容器叫TopView,把下面的滚动容器叫BottomView.
//1.
提供TopViewIQMUIContinuousNestedTopViewtopView=.
.
.
//2.
提供BottomViewIQMUIContinuousNestedBottomViewbottomView=.
.
.
QMUIContinuousNestedScrollLayoutscrollLayout=newQMUIContinuousNestedScrollLayout(context)//3.
将TopView赋值给QMUIContinuousNestedScrollLayoutCoordinatorLayout.
LayoutParamstopLp=newCoordinatorLayout.
LayoutParams(matchParent,matchParent);topLp.
setBehavior(newQMUIContinuousNestedTopAreaBehavior(context));//notnecessaryscrollLayout.
setTopAreaView(topView,topLp);//4.
将BottomView赋值给QMUIContinuousNestedScrollLayoutCoordinatorLayout.
LayoutParamsrecyclerViewLp=newCoordinatorLayout.
LayoutParams(matchParent,matchParent);recyclerViewLp.
setBehavior(newQMUIContinuousNestedBottomAreaBehavior());//notnecessaryscrollLayout.
setBottomAreaView(bottomView,recyclerViewLp);QMUI默认实现了常用的三种TopView:1.
QMUIContinuousNestedTopLinearLayout2.
QMUIContinuousNestedTopRecyclerView3.
QMUIContinuousNestedTopWebView以及可以包装Header与Footer的容器类:QMUIContinuousNestedTopDelegateLayout.
如果上述TopView不能满足需求,可以通过实现IQMUIContinuousNestedTopView实现自定义的TopView.
publicinterfaceIQMUIContinuousNestedTopViewextendsIQMUIContinuousNestedScrollCommon{//消耗滚动,传入参数为可消耗量,返回值为未被消耗的值intconsumeScroll(intdyUnconsumed);//当前滚动位置intgetCurrentScroll();//可滚动范围intgetScrollOffsetRange();}publicinterfaceIQMUIContinuousNestedScrollCommon{//滚动状态,与RecyclerView相同intSCROLL_STATE_IDLE=RecyclerView.
SCROLL_STATE_IDLE;intSCROLL_STATE_DRAGGING=RecyclerView.
SCROLL_STATE_DRAGGING;intSCROLL_STATE_SETTLING=RecyclerView.
SCROLL_STATE_SETTLING;//保存当前滚动信息voidsaveScrollInfo(@NonNullBundlebundle);//恢复滚动信息voidrestoreScrollInfo(@NonNullBundlebundle);//注入滚动监听器voidinjectScrollNotifier(OnScrollNotifiernotifier);interfaceOnScrollNotifier{voidnotify(intinnerOffset,intinnerRange);QMUIContinuousNestedScrollLayoutQMUIContinuousNestedScrollLayout使用使用1.
提供1.
提供TopViewQMUIContinuousNestedScrollLayout11/47voidonScrollStateChange(Viewview,intnewScrollState);}}QMUI只提供了QMUIContinuousNestedBottomRecyclerView以及可以包装Header的容器类:QMUIContinuousNestedBottomDelegateLayout.
如果上述BottomView不能满足需求,可以通过实现IQMUIContinuousNestedBottomView实现自定义的BottomView:publicinterfaceIQMUIContinuousNestedBottomViewextendsIQMUIContinuousNestedScrollCommon{intHEIGHT_IS_ENOUGH_TO_SCROLL=-1;//消耗滚动,传入参数为可消耗量,没有返回值,意味着BottomView必须处理所有的滚动//IQMUIContinuousNestedBottomView需要是NestedScrollingChild,才能方便的处理所有的滚动voidconsumeScroll(intdyUnconsumed);//在duration的时间内滚动dyvoidsmoothScrollYBy(intdy,intduration);//取消上面的smoothScrollvoidstopScroll();//内容高度,如果BottomView内容高度足够滚动,则返回HEIGHT_IS_ENOUGH_TO_SCROLLintgetContentHeight();//当前滚动位置intgetCurrentScroll();//滚动范围intgetScrollOffsetRange();}要使得QMUIContinuousNestedScrollLayout可以正常工作,要使得QMUIContinuousNestedScrollLayout可以正常工作,BottomView最好实现NestedScroll机制.
最好实现NestedScroll机制.
QMUIContinuousNestedScrollLayout本质是CoordinatorLayout,因此TopView和BottomView的LayoutParam需要是CoordinatorLayout.
LayoutParam.
QMUIContinuousNestedScrollLayout重定义了TopView的LayoutParam的height值的含义:1.
如果height==MATCH_PARENT,则其高度最高为父容器高度.
QMUIContinuousNestedTopRecyclerView、QMUIContinuousNestedTopWebView、QMUIContinuousNestedTopDelegateLayout应该设置为它,当内容高度超出容器高度时,可以进行内部滚动.
2.
如果height!
=MATCH_PARENT,则其高度等于它内容的高度.
QMUIContinuousNestedTopLinearLayout应当设置为它(wrap_content),因为LinearLayout内部无法滚动,只能靠外部去驱动它滚动.
QMUIContinuousNestedScrollLayout支持以下scroll行为:方法方法描述描述scrollBy(intdy)滚动dy的距离,正值向上滚,负值向下滚动smoothScrollBy(intdy,intduration)在给定时间滚动dy的距离scrollToTop()滚动到顶部scrollToBottom()滚动到底部scrollBottomViewToTop()将BottomView滚动到顶部2.
提供2.
提供BottomView3.
将TopView/BottomView赋值给QMUIContinuousNestedScrollLayout3.
将TopView/BottomView赋值给QMUIContinuousNestedScrollLayoutscroll支持scroll支持触发scroll触发scrollscroll支持12/47可以通过QMUIContinuousNestedScrollLayout.
addOnScrollListener添加监听器,监听器需要实现OnScrollListener接口:publicinterfaceOnScrollListener{//topCurrent、topRange是指TopView的内部滚动值与滚动范围//bottomCurrent、bottomRange是指BottomView的内部滚动值与滚动范围//offsetCurrent、offsetRange是指TopView与BottomView自身的滚动偏移值和整体可偏移值voidonScroll(inttopCurrent,inttopRange,intoffsetCurrent,intoffsetRange,intbottomCurrent,intbottomRange);//滚动状态://fromTopBehavior标识有TopBehavior触发的滚动状态改变,否则为BottomView内部触发滚动状态变化.
voidonScrollStateChange(intnewScrollState,booleanfromTopBehavior);}对于很多用户友好型的页面,最好能够在再次进入同一个页面时,能够恢复到上次阅读位置.
因此QMUIContinuousNestedScrollLayout提供了对当前位置信息的恢复与还原机制.
方法方法描述描述saveScrollInfo(Bundlebundle)将当前滚动位置存储到Bundle里restoreScrollInfo(Bundlebundle)从Bundle里恢复滚动位置如果是自定义的TopView/BottomView,可以通过重写saveScrollInfo(@NonNullBundlebundle)和voidrestoreScrollInfo(@NonNullBundlebundle)来做完成滚动位置的恢复工作.
scroll监听scroll监听滚动位置恢复与还原滚动位置恢复与还原滚动位置恢复与还原13/47QMUIDialog提供了一系列常用的对话框,解决了系统默认对话框在不同Android版本上的表现不一致的问题.
QMUIDialog一般使用QMUIDialogBuilder及其子类来创建.
各种类型的Builder都应该继承QMUIDialogBuilder,该类提供一些通用的方法.
类:QMUIDialogBuilder主要方法方法名方法名描述描述setTitle(Stringtitle)设置对话框的标题hasTitle()返回对话框是否拥有标题setCanceledOnTouchOutside(booleancanceledOnTouchOutside)设置点击Dialog外部时是否关闭DialogsetOnDecorationListener(QMUIDialogView.
OnDecorationListeneronDecorationListener)设置Dialog的View的onDraw()与dispatchDraw()回调addAction(QMUIDialogActionaction)添加按钮addAction(CharSequencestr,QMUIDialogAction.
ActionListenerlistener)添加按钮和点击事件setActionContainerOrientation(intactionContainerOrientation)设置按钮区域的排列方向(QMUIDialogBuilder.
HORIZONTAL/QMUIDialogBuilder.
VERTICAL)setChangeAlphaForPressOrDisable(booleanchangeAlphaForPressOrDisable)设置点击按钮时、按钮不可点时是否要改变透明度setActionDivider(intthickness,intcolorRes,intstartInset,intendInset)设置按钮之前的分割线宽度、颜色、起始位置缩进、结束位置缩进show()生成一个QMUIDialog,并显示出来create()生成一个QMUIDialog,但不显示出来create(intstyle)根据style样式生成一个QMUIDialog,但不显示出来自定义Builder时可继承的方法方法名方法名描述描述onConfigTitleView(TextViewtitleView)对标题(TextView)进行自定义修改,在标题View创建之后调用onCreateContent(QMUIDialogdialog,ViewGroupparent,Contextcontext)创建标题以下、按钮以上部分的View,并添加到parent中onAfter(QMUIDialogdialog,LinearLayoutparent,Contextcontext)对Dialog进行整体自定义修改,在Dialog的View创建完毕、未显示出来之前调用QMUIDialog的按钮由QMUIDialogAction类负责构建,并可自定义样式.
类:QMUIDialogAction主要方法方法名方法名描述描述setOnClickListener(ActionListeneronClickListener)设置点击事件setEnabled(booleanenabled)设置是否可点击QMUIDialogQMUIDialog基类Builder及其提供的通用方法基类Builder及其提供的通用方法对话框按钮对话框按钮QMUIDialog14/47buildActionView(QMUIDialogdialog,intindex)构造QMUIButton作为对话框按钮QMUI提供了几种常见的对话框Builder.
类:QMUIDialog.
MessageDialogBuilder主要方法方法名方法名描述描述setMessage(CharSequencemessage)设置对话框的提示语使用示例:newQMUIDialog.
MessageDialogBuilder(getActivity()).
setTitle("标题").
setMessage("确定要发送吗").
addAction("取消",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){dialog.
dismiss();}}).
addAction("确定",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){dialog.
dismiss();}}).
show();类:QMUIDialog.
CheckBoxMessageDialogBuilder'主要方法方法名方法名描述描述setMessage(CharSequencemessage)设置对话框的提示语setChecked(booleanchecked)设置CheckBox勾选状态isChecked()获取CheckBox是否被勾选使用示例:newQMUIDialog.
CheckBoxMessageDialogBuilder(getActivity()).
setTitle("退出后是否删除账号信息").
setMessage("删除账号信息").
setChecked(true).
addAction("取消",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){dialog.
dismiss();}}).
addAction("退出",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){dialog.
dismiss();常见的对话框类型常见的对话框类型消息类型对话框消息类型对话框带CheckBox的消息确认框带CheckBox的消息确认框QMUIDialog15/47}}).
show();类:QMUIDialog.
EditTextDialogBuilder'主要方法方法名方法名描述描述setPlaceholder(Stringplaceholder)设置输入框的placeholdersetDefaultText(CharSequencedefaultText)设置输入框的默认文字setInputType(intinputType)设置EditText的inputType使用示例:finalQMUIDialog.
EditTextDialogBuilderbuilder=newQMUIDialog.
EditTextDialogBuilder(getActivity());builder.
setTitle("标题").
setPlaceholder("在此输入您的昵称").
setInputType(InputType.
TYPE_CLASS_TEXT).
addAction("取消",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){dialog.
dismiss();}}).
addAction("确定",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){CharSequencetext=builder.
getEditText().
getText();if(text!
=null&&text.
length()>0){Toast.
makeText(getActivity(),"您的昵称:"+text,Toast.
LENGTH_SHORT).
show();dialog.
dismiss();}else{Toast.
makeText(getActivity(),"请填入昵称",Toast.
LENGTH_SHORT).
show();}}}).
show();类:QMUIDialog.
MenuDialogBuilder'主要方法方法名方法名描述描述addItems(CharSequence[]items,OnClickListenerlistener)添加多个菜单项和点击事件addItem(CharSequenceitem,OnClickListenerlistener)添加单个菜单项和点击事件使用示例:finalString[]items=newString[]{"选项1","选项2","选项3"};newQMUIDialog.
MenuDialogBuilder(getActivity()).
addItems(items,newDialogInterface.
OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){Toast.
makeText(getActivity(),"你选择了"+items[which],Toast.
LENGTH_SHORT).
show();dialog.
dismiss();}带输入框的对话框带输入框的对话框菜单类型的对话框菜单类型的对话框QMUIDialog16/47}).
show();类:QMUIDialog.
CheckableDialogBuilder'主要方法方法名方法名描述描述addItems(CharSequence[]items,OnClickListenerlistener)添加多个菜单项和点击事件addItem(CharSequenceitem,OnClickListenerlistener)添加单个菜单项和点击事件setCheckedIndex(intcheckedIndex)设置选中的菜单项的下标getCheckedIndex()获取选中项的下标使用示例:finalString[]items=newString[]{"选项1","选项2","选项3"};finalQMUIDialog.
CheckableDialogBuilderbuilder=newQMUIDialog.
CheckableDialogBuilder(getActivity());builder.
setTitle("请选择").
setCheckedIndex(1).
addItems(items,newDialogInterface.
OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){builder.
setCheckedIndex(which);}}).
addAction("确定",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){Toast.
makeText(getActivity(),"你选择了"+items[builder.
getCheckedIndex()],Toast.
LENGTH_SHORT).
show();dialog.
dismiss();}}).
show();类:QMUIDialog.
MultiCheckableDialogBuilder'主要方法方法名方法名描述描述addItems(CharSequence[]items,OnClickListenerlistener)添加多个菜单项和点击事件addItem(CharSequenceitem,OnClickListenerlistener)添加单个菜单项和点击事件setCheckedItems(intcheckedItems)设置被选中的菜单项下标(用int二进制中为1的位来表示该选项被选中)setCheckedItems(int[]checkedIndexes)设置被选中的菜单项下标数组(用数组的每一位来表示被选中项的下标)getCheckedItemRecord()获取选中项的下标(用int二进制中为1的位来表示该选项被选中)getCheckedItemIndexes()获取选中项的下标数组(用数组的每一位来表示被选中项的下标)使用示例:finalString[]items=newString[]{"选项1","选项2","选项3","选项4","选项5","选项6"};finalQMUIDialog.
MultiCheckableDialogBuilderbuilder=newQMUIDialog.
MultiCheckableDialogBuilder(getActivity()).
setCheckedItems(newint[]{1,3}).
addItems(items,newDialogInterface.
OnClickListener(){@Override单选菜单类型的对话框单选菜单类型的对话框多选菜单类型的对话框多选菜单类型的对话框QMUIDialog17/47publicvoidonClick(DialogInterfacedialog,intwhich){}});builder.
addAction("取消",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){dialog.
dismiss();}});builder.
addAction("提交",newQMUIDialogAction.
ActionListener(){@OverridepublicvoidonClick(QMUIDialogdialog,intindex){Stringresult="你选择了";for(inti=0;i@drawable/your_dialog_bg支持的属性如下:属性名属性名描述描述qmui_dialog_min_widthDialog最小宽度qmui_dialog_max_widthDialog最大宽度qmui_dialog_bgDialog的背景Drawableqmui_dialog_radiusDialog的圆角大小qmui_dialog_margin_verticalDialog的上下最小间距qmui_dialog_padding_horizontalDialog的左右内间距qmui_dialog_background_dim_amountDialog的底层遮罩不透明度qmui_dialog_wrapper_styleDialog的容器View样式qmui_dialog_title_styleDialog的标题View样式qmui_dialog_action_container_styleDialog的按钮区域容器View样式qmui_dialog_action_styleDialog的按钮View样式qmui_dialog_message_content_styleMessageDialogBuilder创建出的Dialog中的消息View的样式qmui_dialog_edit_content_styleEditTextDialogBuilder创建出的Dialog中的输入框View的样式qmui_dialog_menu_container_styleMenuDialogBuilder创建出的Dialog中的选项容器View的样式自定义对话框自定义对话框全局配置QMUIDialog样式全局配置QMUIDialog样式QMUIDialog18/47qmui_dialog_menu_item_styleMenuDialogBuilder创建出的Dialog中的选项View的样式QMUIDialog19/47QMUIEmptyView是一个通用的空界面控件,支持显示loading、主标题、副标题和按钮,这些控件按顺序从上到下排列,并可按需组合显示.
属性名属性名描述描述qmui_show_loading是否要显示loadingqmui_title_text标题文字qmui_detail_text副标题文字qmui_btn_text按钮文字方法名方法名描述描述show(booleanloading)切换loading的显示/隐藏,同时隐藏标题、副标题和按钮show(StringtitleText,StringdetailText)显示标题和副标题(如果需要只显示其中之一可设置另一个为null),同时隐藏loading和按钮show(booleanloading,StringtitleText,StringdetailText,StringbuttonText,OnClickListeneronButtonClickListener)同时设置loading的显隐、标题、副标题、按钮文字和按钮的点击事件hide()隐藏整个QMUIEmptyView,并清除各个控件的内容setLoadingShowing(booleanshow)单独设置loading的显示/隐藏,不改变其他控件的内容setTitleText(Stringtext)单独设置标题的内容,不改变其他控件的内容setDetailText(Stringtext)单独设置副标题的内容,不改变其他控件的内容setButton(Stringtext,OnClickListeneronClickListener)单独设置按钮的文字和点击事件,不改变其他控件的内容QMUIEmptyViewQMUIEmptyView效果图效果图xml属性xml属性主要方法主要方法QMUIEmptyView20/47QMUIFloatLayout是一个自定义ViewGroup,对其子View进行浮动布局并自动换行.
属性名属性名描述描述android:gravity子元素布局的水平对齐方式(Gravity.
LEFT/Gravity.
RIGHT/Gravity.
CENTER_HORIZONTAL)android:maxLines最多可显示的行数(与qmui_maxNumber不可同时使用)qmui_maxNumber最多可显示的子元素个数(与android:maxLines不可同时使用)qmui_childHorizontalSpacing子元素之间的水平间距qmui_childVerticalSpacing子元素之间的垂直间距方法名方法名描述描述setGravity(intgravity)设置子元素布局的水平对齐方式(支持Gravity.
LEFT/Gravity.
RIGHT/Gravity.
CENTER_HORIZONTAL)getGravity()获取子元素布局的水平对齐方式setMaxLines(intmaxLines)设置最多可显示的行数getMaxLines()获取最多可显示的行数(没有限制时返回-1)setMaxNumber(intmaxNumber)设置最多可显示的子元素的个数getMaxNumber()获取最多可显示的子元素的个数(没有限制时返回-1)getLineCount()获取显示的内容的行数(在onMeasure之后该方法的返回值才准确,建议在OnLineCountChangeListener回调中获取)setOnLineCountChangeListener(OnLineCountChangeListeneronLineCountChangeListener)监听显示的内容行数的变化setChildHorizontalSpacing(intspacing)设置子元素之间的水平间距setChildVerticalSpacing(intspacing)设置子元素之间的垂直间距QMUIFloatLayoutQMUIFloatLayout效果图效果图xml属性xml属性主要方法主要方法QMUIFloatLayout21/47QMUIRoundButtonDrawable是一个提供了圆角功能的Drawable.
方法名方法名描述描述setBgData(ColorStateListcolors)设置背景色(只支持纯色,不支持Bitmap或Drawable)setStrokeData(intwidth,ColorStateListcolors)设置描边宽度和颜色setIsRadiusAdjustBounds(booleanisRadiusAdjustBounds)设置圆角大小是否自动适应为宿主View的宽高两者最小者的一半(Math.
min(width,height)/2)fromAttributeSet(Contextcontext,AttributeSetattrs,intdefStyleAttr)根据View的xml属性创建一个QMUIRoundButtonDrawable实例(见下文)通过静态方法QMUIRoundButtonDrawable.
fromAttributeSet(Contextcontext,AttributeSetattrs,intdefStyleAttr)方法可以创建一个QMUIRoundButtonDrawable,将该Drawable设置给View作为背景,可使View支持圆角.
1.
在View的构造函数中调用QMUIRoundButtonDrawable.
fromAttributeSet(Contextcontext,AttributeSetattrs,intdefStyleAttr)方法生成drawable,并作为自己的background.
如:publicclassQMUIRoundFrameLayoutextendsFrameLayout{publicQMUIRoundFrameLayout(Contextcontext){super(context);init(context,null,0);}publicQMUIRoundFrameLayout(Contextcontext,AttributeSetattrs){super(context,attrs);init(context,attrs,0);}publicQMUIRoundFrameLayout(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAttr);init(context,attrs,defStyleAttr);}privatevoidinit(Contextcontext,AttributeSetattrs,intdefStyleAttr){QMUIRoundButtonDrawablebg=QMUIRoundButtonDrawable.
fromAttributeSet(context,attrs,defStyleAttr);QMUIViewHelper.
setBackgroundKeepingPadding(this,bg);}}2.
在attrs.
xml中定义,将该View的className作为name属性的值,如:3.
这样就能使该View支持以上xml属性,如这样使用:对于通过View的xml属性构造QMUIRoundButtonDrawable的情况,QMUIRoundButtonDrawable支持识别该View的以下属性:属性名属性名描述描述qmui_backgroundColor背景颜色qmui_borderColor边框颜色qmui_borderWidth边框宽度qmui_radiusTopLeft左上角圆角大小qmui_radiusTopRight右上角圆角大小qmui_radiusBottomLeft左下角圆角大小qmui_radiusBottomRight右下角圆角大小qmui_radius四个角的圆角大小注意:若使用radiusTopLeft、qmui_radiusTopRight、qmui_radiusBottomRight、qmui_radiusBottomRight指定了某一个角的圆角大小且其值大于0,则该属性无效qmui_isRadiusAdjustBounds是否根据宿主View的大小自适应圆角注意:若使用radiusTopLeft、qmui_radiusTopRight、qmui_radiusBottomRight、qmui_radiusBottomRight、qmui_radius指定了某一个角或所有角的圆角大小且其值大于0,则该属性无效因为该控件的圆角采用View的background实现,所以与原生的android:background有冲突.
QMUIroundwidgetsxml属性xml属性注意注意相关类相关类QMUIRoundButtonDrawable23/47QMUIStickySectionLayout用于解决两个需求场景:1.
可折叠展开的section列表(list/grid)2.
类似iOS一样可以在列表(list/grid)滚动过程中悬浮(sticky)当前的sectionheader这个组件需要使用者提供两个数据model:SectionHeader,SectionItem.
它们都需要实现QMUISection.
Model这个接口:publicinterfaceModel{/***组件会通过[DiffUtil](https://developer.
android.
com/reference/android/support/v7/util/DiffUtil)去驱动数据更新以保留item动画,那么组件就需要备份当前数据用于下一*这不是必须的,如果调用者能够保证每次QMUIStickySectionAdapter#setData的数据的内存值不相同,那么内部就不需要备份这些数据了.
*备份数据不会用于渲染,所以只需要clone用于diff的字段**@returnT的新实例*/TcloneForDiff();/***用于QMUIDiffCallback判断两个item是不是代表同一个对象.
*例如,只要useid相同,就可以判定为时同一个用户.
**@return如果是同一个对象则返回true,否则返回false.
*/booleanisSameItem(Tother);/***在两个item表示的是同一个对象的前提下,用于QMUIDiffCallback判断两个item的内容是否相同.
**@return如果内容相同则返回true,否则返回false.
*/booleanisSameContent(Tother);}QMUISection.
Model的接口isSameItem与isSameContent的概念都来源于DiffUtil,如果对DiffUtil还不了解的话,可以去官网查看与学习.
在QMUIDemo中,提供了SectionHeader和SectionItem的示例,可点击查看.
在准备好这两个model后,我们就可以构建adapter需要用到的QMUISection了,其中H、T就是之前准备的SectionHeader和SectionItem.
QMUIDemo示例:privateQMUISectioncreateSection(StringheaderText,booleanisFold){SectionHeaderheader=newSectionHeader(headerText);ArrayListcontents=newArrayList();for(inti=0;isection=newQMUISection(header,contents,isFold);//如果section的item存在加载更多的需求,可通过以下两个调用告诉section是否需要加载更多QMUIStickySectionLayoutQMUIStickySectionLayout使用使用1.
通过XML或Java代码构造1.
通过XML或Java代码构造QMUIStickySectionLayout实例:实例:2.
准备好数据模型2.
准备好数据模型QMUIStickySectionLayout24/47//section.
setExistAfterDataToLoad(true);//section.
setExistBeforeDataToLoad(true);returnsection;}QMUIStickySectionLayout的adapter需要继承自QMUIStickySectionAdapter,如果没有自定义ViewHolder的需求,那么可以直接继承自QMUIDefaultStickySectionAdapter以简化业务代码publicclassQDGridSectionAdapterextendsQMUIDefaultStickySectionAdapter{@NonNull@OverrideprotectedVHonCreateSectionHeaderViewHolder(@NonNullViewGroupviewGroup){//onCreaterViewHolderforsectionHeader}@NonNull@OverrideprotectedVHonCreateSectionItemViewHolder(@NonNullViewGroupviewGroup){//onCreaterViewHolderforsectionItem}@NonNull@OverrideprotectedVHonCreateSectionLoadingViewHolder(@NonNullViewGroupviewGroup){//onCreaterViewHolderforsectionLoading}@NonNull@OverrideprotectedVHonCreateCustomItemViewHolder(@NonNullViewGroupviewGroup,inttype){//扩展用法,详细内容请看自定义扩展相关的内容}@OverrideprotectedvoidonBindSectionHeader(VHholder,intposition,QMUISectionsection){//onBindViewHolderforsectionItem}@OverrideprotectedvoidonBindSectionItem(VHholder,intposition,QMUISectionsection,intitemIndex){//onBindViewHolderforsectionItem}@OverrideprotectedvoidonBindSectionLoadingItem(VHholder,intposition,QMUISectionsection,booleanloadingBefore){//onBindViewHolderforsectionLoading}@OverrideprotectedvoidonBindCustomItem(VHholder,intposition,@NullableQMUISectionsection,intitemIndex){//扩展用法,详细内容请看自定义扩展相关的内容}}准备好Adapter后,我们通过QMUIStickySectionAdapter#setData(@NullableList>data,booleanonlyMutateState)将数据传递给adapter.
它需要提供两个参数,第一个参数就是就是一个QMUISection的列表结构,前面我们已经准备好了,第二个参数存在的原因在QMUISection.
Model里也提及到了,这里再着重强调一下:组件会通过组件会通过DiffUtilDiffUtil去驱动数据更新以保留item动画,那么组件就需要备份当前数据用于下一次数据diff.
如果你能确保下一次setData时section去驱动数据更新以保留item动画,那么组件就需要备份当前数据用于下一次数据diff.
如果你能确保下一次setData时section列表中的SectionHeader和SectionItem不会引用同一份数据,那么你可以传递onlyMutateState为true以优化性能列表中的SectionHeader和SectionItem不会引用同一份数据,那么你可以传递onlyMutateState为true以优化性能在组件内部,onlyMutateState的作用是:1.
如果onlyMutateState==true,那么执行浅拷贝,只拷贝QMUISection及其状态,之所以要拷贝QMUISection,那是因为折叠/展开等内部操作也会影响到它的状态.
3.
实现Adapter3.
实现AdapterQMUIStickySectionLayout25/472.
如果onlyMutateState==false,那么执行深拷贝,这个时候就不仅会拷贝QMUISection,还会调用QMUISection.
Model#cloneForDiff去拷贝SectionHeader以及SectionItem.
如果下一次setData的数据不会引用同一份数据,那么这将是耗费性能和内存的行为.
如果在某些场景下,你想通过notifyDataChanged去做无动画刷新数据,你可以调用QMUIStickySectionAdapter#setDataWithoutDiff(@NullableList>data,booleanonlyMutateState)去更新数据.
通过QMUIStickySectionAdapter#setCallback,使用者可以接收到loadMore事件以及item点击/长按事件.
并且通过ViewHolder.
isForStickyHeader可以判断是否是stickyHeadermAdapter.
setCallback(newQMUIStickySectionAdapter.
Callback(){@OverridepublicvoidloadMore(finalQMUISectionsection,finalbooleanloadMoreBefore){//onlyfordemo,ignoretohandlerepeatloadMoremSectionLayout.
postDelayed(newRunnable(){@Overridepublicvoidrun(){if(isAttachedToActivity()){ArrayListlist=newArrayList();for(inti=0;igetSection(intposition);//根据index直接获取QMUISectionQMUISectiongetSectionDirectly(intindex);//根据position获取sectionitemTgetSectionItem(intposition);//通过PositionFinder来寻找感兴趣的item的position.
unFoldTargetSection决定是否要展开目标sectionintfindPosition(PositionFinderpositionFinder,booleanunFoldTargetSection)//通过sectionIndex和itemIndex来寻找item的positionintfindPosition(intsectionIndex,intitemIndex,booleanunFoldTargetSection)//这个方法仅仅用于自定义扩展的itemintfindCustomPosition(intsectionIndex,intcustomItemIndex,booleanunFoldTargetSection)折叠展开是基础功能,而业务上也经常需要我们滚动特定的sectionheader或sectionitem.
因此组件也提供了这几个功能的支持.
//切换折叠状态,scrollToTop决定是否要将展开的section滚动到顶部去voidtoggleFold(intposition,booleanscrollToTop)//滚动到指定的sectionheader//scrollToTop为true,则滚动到顶部,否则只是滚动到可见区域voidscrollToSectionHeader(@NonNullQMUISectiontargetSection,booleanscrollToTop)//滚动到指定的section中指定的item//scrollToTop为true,则滚动到顶部(不被sectionheader遮挡),否则只是滚动到可见区域voidscrollToSectionItem(@NullableQMUISectiontargetSection,@NonNullTtargetItem,booleanscrollToTop)折叠与展开、滚动定位折叠与展开、滚动定位加载更多加载更多折叠与展开、滚动定位27/47如果一个section的item数量特别多,很可能需要做加载更多的需求,因此组件也提供了内部支持.
使用者可通过以下步骤开启加载更多:1.
在QMUISection通过setExistBeforeDataToLoad和setExistAfterDataToLoad指示section是否存在加载更多;2.
在Adapter中重写onCreateSectionLoadingViewHolder提供loadingview;3.
通过QMUIStickySectionAdapter#setCallback提供loadMore的处理逻辑;4.
当数据回来时,通过QMUIStickySectionAdapter#finishLoadMore将数据添加到Adapter中,完成加载更多.
加载更多有一个附加行为:加载更多会锁住之前或之后的内容.
例如,如果是向后加载更多,那么加载期间,无法滚动到加载section之后的section.
这样可以保证用户不会跳过加载中的内容.
需求总是复杂的,上面我们实现了一个折叠展开、悬浮sectionheader、滚动到特定位置等功能,但是实际业务会经常会遇到一下场景:1.
在整个列表前添加一个header;2.
在整个列表结束后加一个footer;3.
在sectionitem列表前加一个提示语;4.
在sectionitem列表结束后加一个结束语.
QMUIStickySectionLayout提供了对这些功能的支持,接下来我们看看如何实现这些功能:@OverrideprotectedQMUISectionDiffCallbackcreateDiffCallback(List>lastData,List>currentData){returnnewQMUISectionDiffCallback(lastData,currentData){@OverrideprotectedvoidonGenerateCustomIndexBeforeSectionList(IndexGenerationInfogenerationInfo,List>list){//在整个列表前添加自定义itemgenerationInfo.
appendWholeListCustomIndex(ITEM_INDEX_LIST_HEADER);}@OverrideprotectedvoidonGenerateCustomIndexAfterSectionList(IndexGenerationInfogenerationInfo,List>list){//在整个列表结束后添加自定义itemgenerationInfo.
appendWholeListCustomIndex(ITEM_INDEX_LIST_FOOTER);}@OverrideprotectedvoidonGenerateCustomIndexBeforeItemList(IndexGenerationInfogenerationInfo,QMUISectionsection,intsectionIndex){//在sectionitem列表前添加自定义itemif(!
section.
isExistBeforeDataToLoad()){generationInfo.
appendCustomIndex(sectionIndex,ITEM_INDEX_SECTION_TIP_START);}}@OverrideprotectedvoidonGenerateCustomIndexAfterItemList(IndexGenerationInfogenerationInfo,QMUISectionsection,intsectionIndex){//在sectionitem列表结束后添加自定义itemif(!
section.
isExistAfterDataToLoad()){generationInfo.
appendCustomIndex(sectionIndex,ITEM_INDEX_SECTION_TIP_END);}}@OverrideprotectedbooleanareCustomContentsTheSame(@NullableQMUISectionoldSection,intoldItemIndex,@NullableQMUISection//判断自定义item的内容是否相同,组件并没有去备份自定义item的内容,所以这些都需要使用者自己去处理//或者可以通过adapter.
findCustomPostion去获取自定义item的position,然后通过notifyItemChanged去更新内容自定义扩展自定义扩展1.
在Adapter里重写1.
在Adapter里重写createDiffCallback返回自定义的返回自定义的QMUISectionDiffCallback::自定义扩展28/47returntrue;}};}QMUISectionDiffCallback提供了四个钩子函数,用于使用者来添加自定义的item,使用者为每一个自定义item定义一个无重复的ItemIndex,最好为负数.
组件内部定义了一个偏移量ITEM_INDEX_CUSTOM_OFFSET=-1000以避免与内部使用的index发生冲突,当然,如果在这个前提下依旧与内部使用的itemindex冲突,那么组件就会抛出错误.
通过IndexGenerationInfo#appendWholeListCustomIndex添加无section信息的customindex,实际上是将sectionindex设置为-1.
通过IndexGenerationInfo#appendCustomIndex添加section内的customindex.
每一个钩子函数里可多次调用append函数添加多个自定义item,但是需要保证同一个section(或者整个无section信息)内的自定义item的customindex不要重复.
@OverrideprotectedintgetCustomItemViewType(intitemIndex,intposition){if(itemIndex==ITEM_INDEX_LIST_HEADER){returnITEM_TYPE_LIST_HEADER;}elseif(itemIndex==ITEM_INDEX_LIST_FOOTER){returnITEM_TYPE_LIST_FOOTER;}elseif(itemIndex==ITEM_INDEX_SECTION_TIP_START){returnITEM_TYPE_SECTION_TIP_START;}elseif(itemIndex==ITEM_INDEX_SECTION_TIP_END){returnITEM_TYPE_SECTION_TIP_END;}returnsuper.
getCustomItemViewType(itemIndex,position);}这里与getItemViewType处理逻辑类似,不过这里更多的是依靠itemIndex来返回不同的viewType.
在adapter里通过onCreateCustomItemViewHolder创建ViewHolder,通过onBindCustomItem绑定数据,这与传统的多viewType处理大体相同.
在某些外界条件干预下,customitem或许会出现增删改的变化,这个时候我们可以通过QMUIStickySectionAdapter#refreshCustomData()通知adapter刷新数据.
如果仅仅是某个customitem的内容发生改变,我们也可以通过QMUIStickySectionAdapter#findCustomPosition找到item的position,然后通过notifyItemChanged通知adapter刷新数据,这样更加轻量.
这不能用于添加与删除,因为这两个操作我们必须同时更新两个index信息.
2.
在Adapter里重写2.
在Adapter里重写getCustomItemViewType做多viewType处理做多viewType处理3.
onCreateCustomItemViewHolder/onBindCustomItem3.
onCreateCustomItemViewHolder/onBindCustomItem4.
数据更新4.
数据更新自定义扩展29/47QMUITopBar可作为App通用的顶部Bar,提供了以下功能:1.
在左侧/右侧添加图片按钮/文字按钮/自定义View.
2.
设置标题/副标题,且支持设置标题/副标题的水平对齐方式.
属性名属性名描述描述qmui_topbar_title_gravity标题的水平对齐方式qmui_topbar_need_separator是否需要底部分隔线qmui_topbar_separator_color底部分隔线的颜色qmui_topbar_separator_height底部分隔线的高度qmui_topbar_bg_color背景色qmui_topbar_left_back_drawable_id左侧返回按钮的图片drawableResIdqmui_topbar_title_text_size标题的字号大小qmui_topbar_title_text_size_with_subtitle存在副标题时的标题字号大小qmui_topbar_subtitle_text_size副标题字号大小qmui_topbar_title_color标题文字颜色qmui_topbar_subtitle_color副标题文字颜色qmui_topbar_title_margin_horizontal_when_no_btn_aside标题左右无按钮时标题与TopBar左右边缘的距离qmui_topbar_title_container_padding_horizontal标题左右的内间距(长标题时可见效果)qmui_topbar_image_btn_width左右图片按钮的宽度qmui_topbar_image_btn_height左右图片按钮的高度qmui_topbar_text_btn_padding_horizontal左右文字按钮的水平内间距(文字按钮的宽度由文字宽度+该左右padding决定)qmui_topbar_text_btn_color_state_list左右文字按钮的颜色qmui_topbar_text_btn_text_size左右文字按钮的字号大小各个属性的默认样式配置见qmui_style_widget.
xml@style/YourTopBarStyle#FFFFFF方法名方法名描述描述addLeftBackImageButton()在TopBar左边添加一个返回图标按钮,返回图标图片由xml属性qmui_topbar_left_back_drawable_id指定QMUITopBarQMUITopBar效果图效果图xml属性xml属性全局配置组件样式的示例全局配置组件样式的示例主要方法主要方法QMUITopBar30/47addLeftImageButton(intdrawableResId,intviewId)、addRightImageButton(intdrawableResId,intviewId)根据resourceId在TopBar左右添加一个图片按钮addLeftTextButton(intstringResId,intviewId)、addRightTextButton(intstringResId,intviewId)在TopBar左右添加一个文字按钮addLeftView(Viewview,intviewId,LayoutParamslayoutParams)、addRightView(Viewview,intviewId,LayoutParamslayoutParams)在TopBar左右添加自定义View.
如果是图片按钮或文字按钮,可通过generateTopBarImageButtonLayoutParams()和generateTopBarTextButtonLayoutParams()方法创建LayoutParamssetTitle(intresId)、setTitle(Stringtitle)设置标题文字setSubTitle(intresId)、setSubTitle(StringsubTitle)设置副标题文字setTitleGravity(intgravity)设置标题、副标题的对齐方式showTitleView(booleantoShow)切换标题、副标题的显示/隐藏setCenterView(Viewview)设置自定义View到TopBar中间removeAllLeftViews()、removeAllRightViews()移除TopBar左右所有的ViewremoveCenterViewAndTitleView()移除TopBar的centerView和titleViewsetBackgroundAlpha(intalpha)设置背景透明度(包括分割线,因为分割线依附于背景Drawable)setBackgroundDividerEnabled(booleanenabled)设置底部分隔线的显示/隐藏computeAndSetBackgroundAlpha(intcurrentOffset,intalphaBeginOffset,intalphaTargetOffset)根据传入的三个值(当前值、初始值、最终值)计算决定TopBar的背景透明度QMUITopBarLayout相关类相关类QMUITopBar31/47QMUITopBarLayout是对QMUITopBar的一个包装,用于沉浸式状态栏场景,其内部将自带一个QMUITopBar作为子View.
在沉浸式状态栏场景下,如果希望将顶部Bar延伸到状态栏的底部,就需要对顶部Bar设置android:fitsSystemWindows="true".
而设置该属性后,该View将被系统设置一个paddingTop(为了使View内部的内容不与状态栏重叠).
又因为QMUITopBar需要在高度固定的前提下使用,不方便被设置padding.
所以需要在QMUITopBar的外层包裹多一层容器,使android:fitsSystemWindows和padding作用在这一层,不影响内部的QMUITopBar.
所以便有了QMUITopBarLayout.
如果App希望顶部Bar能延伸到状态栏背面,则应该使用QMUITopBarLayout配合QMUIWindowInsetLayout来实现.
布局xml如下:QMUITopBarQMUITopBarLayoutQMUITopBarLayoutQMUITopBarLayout在沉浸式状态栏中的作用QMUITopBarLayout在沉浸式状态栏中的作用使用示例使用示例相关类相关类QMUITopBarLayout32/47QMUIVerticalTextView是支持将文字垂直排版的TextView,并对非CJK(中文、日文、韩文)字符做90度旋转排版.
方法名方法名描述描述setVerticalMode(booleanverticalMode)切换垂直排版模式isVerticalMode()获取是否处于垂直排版模式QMUIVerticalTextViewQMUIVerticalTextView效果图效果图主要方法主要方法QMUIVerticalTextView33/47QMUIContinuousNestedScrollLayoutQMUIStickySectionLayoutQMUITopBarQMUITopBarLayoutQMUIroundwidgetsQMUIRoundButtonDrawableQMUIalphawidgetsQMUIAlphaViewHelperQMUIDialogQMUIEmptyViewQMUIFloatLayoutQMUIVerticalTextView组件的全局配置QMUI学习资源QMUIQ&A提供LayoutInspector文件_Sidebar_Sidebar组件文档组件文档全局配置全局配置其他帮助其他帮助_Sidebar34/47PNGIHDR{xzYMsRGB@IDATxtU$Avl(Vl(E"(wQl{o$$dMvfw}OLsg7SN煂(.
@@@@8P%!
=@@@xS$@@@@o*@@@(@sM@o@@paρ7KB@@{9rIa@@@=T.
@@78P%!
=@@@xS$@@@@o*@@@(kQFRL\C@@T%%Ev--_~vVb'*~t-n~~[l;^$vO@@L@>,=&O&2Fv[zdIA@@.
v;-aOBA@@.
v;-aQ7/i@@mE@@Wg7!
imagesimagesQMUIDialog_checkablemenuQMUIDialog_checkablemenuimages35/47PNGIHDR{V3sRGB@IDATxMg(IHBA$k);2BRJ{s~{g|w{|v@DHQ`HHHHHH4TA$@e/o*D$T$@e/o*D$T$@e/o*D$T$@e/o*D$T$@e/o*D$T$@e/o*D$T$@e/o*D$T$@e/o*D$T$8,HHHHH@iD7HHHHH"8#rH$e@T"rH$nW2eH\$I{lHHHHHJyS>,kN6m+km[/d$7u67N*zS6D$bA'SlQImD[lQB$NNeQ7#-o+-----------------------------p5ILG'fHHHHHH){CGhHHHHHHM(n'N;IHHHHH4{>S$wauvIHHHHHTt鲜:s;sHHHHHH,U;qyr9@X}GN,fI>J|6LxRzY2galHHHHHHet9$wU&MD'Kp;LzQK"qX]qádI:sHHHHHH>){o9&ROHHHHHHBXEHHHHHe^DUQ;M$58qboX%Kk-8HN)FyqV:uZ5me\5a7onc$@$n,]!
W\\]byI2e!
dn&)Xd>b9ed2o>_uq%Va3)^(~M&`:U*9!
z91xGKHH]nu8|T@k^g5_Q9^{SΞ;g\9PcJef5\RQnKn.
u0.
0yz[c6X%^_(mj7!
`>]8y8TV7mwzfrDlY9U2\\~]N:SQ5r媿t]z5[5K%fYfS+dk>iI),miJm$oRDqiPMHY|γTu@tLK*q976n=\w~y[OIE)AJ_GH0(7hV3ggb^JbwI9~fo{K@GFNv#y.
S)ZWQMUIDialog_checkboxmessageQMUIDialog_checkboxmessageimages36/47PNGIHDR{.
sRGB@IDATxUCwtb7(v+vXGy.
[iRasw3sf=NSN9e@.
@@@^T.
@@=^T.
@@=^T.
@@=^T.
@@=^T.
@@=^T.
@@=^T.
@@=^T.
@@=^T.
@@=@娯f6-[4+G^}K}PV2M3>|xE[M41'|iMI@jR5x=fYFd8"T1P(IEy[@@&HQT%`OM@@@"@Q$Y7-#"EMm@${0S^D"@3EMm@${0S^D"@3T^xq5RPQ`]\\:@T18D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@${0S^D"@3EMm@$#J,zj3kl8M46*U1^>ci37M,~{-rZ,^LW^NmS"%`gS([R_79LfM=~W3I|nj|D@@9LLkzL/;Ok5r洎d}=2o2+r@@8$5{.
^^YdNt^fmF(`hrnrb-QMUIDialog_edittextQMUIDialog_edittextimages37/47PNGIHDR{.
sRGB@IDATxxUEB5{v]k+"EPP(u(HS@B==7In99z3sf{o2dH@@@J@u7%@PJC@W*7@P%P`>Tn@@o@@({%rK@+[B@@@@@J^|@PJC@W*7@P%P`>Tn@@o@@({%rK@+[B@@@@@J^|@PJC@@@=@@@(P%%@@@(SB[G@@J@K/KzLwvi@@R4oXBKj!
s4jA@@@iG:J\\cpl=)!
4HS7sM@c"J{:dIB@@v'c#G=]NF{yIsNF{QMUIDialog_menuQMUIDialog_menuimages38/47PNGIHDR{V3sRGB@IDATxU3CYr$1~5c(JFr9ifH=5TMLwOwMwMM>nj2v)$@.
@@@@@HB$\\@{IxS$rI@%M@K%!
{I(@7KB@@@@@P`/o*;$^T.
@@w@@HB$LJIvI\\8@@@P`/o*;$@4|p4jH=@@@E.
[l9sS=W,SziS/"^h^=jx@{@@@giLe$yy[9M@c"*{dIA@@R]`OP@@@T26$#fJs^F{V@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[=o9'@@V`[ox"@3'A@@!
yI@@@ol'{0s@@@[{Yy{E@@@@iuiK"O@@@B$,yl=)Yht{/^G@@"=ɑu7F8%!
$Z[7G@@`#g^-=o@@@/`oA5.
c5i(ho@@@/`S$f,U2W@CWV.
S[uj*@@@qmt)7-23{s@@@@cQ\\{x'`ip&@@@I%J{eT>Pi@@Hc@@@;{Ys$o*TC8G`lBL'N]v;S[:)/`RKfZwwA\Ia=@@jUZg^!
[qV_7UTI}@@H{+V3$''v1/+_uup;7lT4@@J@=_l19e6l|Bt`BK'3#|B}Tu&+"@@@\ujmε3{xw~Xgn>zW[F-!
@@\ti),C@zuOQyT;+-=WSvT^m@@`O/4\\R;nNk:wD*dVm&g/.
:)S&.
|@R=-e+IU.
F3WJSZy[2@@J@=hc6bZ9u48PG/+Vl9Qmj8,@$$S@gWutEOnyH~-$^)(t$dv426nMR$+i;lffE-"PJ]iSr^Um^-EguT)9(PDz&#o$-{>}P-W%sGv(]tMr!
2=!
{>N^SmWHY3nNK]w^O~3w/iG+VV*Vr_V"@bΛH/\lo2qi-ci3QyjUzv,wvWt"{Q&_AwtZt>)/@O6l$&Ojz[h}^_~zrK/q[(!
LiY6`)O{It2u-cB)SuwKyg}6AnCtgpwd@>R\c{pkSz`O==j']q.
\FUg4a[OdGf'S@S~T7'9#/q+_|mel**d:,*NN}\4mi{l]+h{mzkdeINNsh(7m6}WeCM:Xn1u_4]8wB2)[c/^M#QMUIDialog_messageQMUIDialog_messageimages39/47PNGIHDR{FTsRGB@IDATx|UZBQzuUZbGXVH3$x'wn7s73sgyw9@@@FUo)@/${QxS@${QxS@${QxS@${QxS@${QxS@${QxS@${QxS@${QxS@${QxSjO>Y&;v7SR},^X+,j\{rG4Z@ni}/KVVV0NSB@@h§9Q(KH=PVB@@hNQJH=}dIA@@@(s${:@@B1f}Bq[@@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+@ZoZC@@B"@fA@@B+1%FP@PV@@@AQB@hHQq}V6xTO24=@@@KwI]z6S4hmI@@@@^iiW4Z"@@@Sd)&&F@V-KG:.
Z+g@@@${qU@@@>,1&k/8@@@>%{{P@@@-0NgC@@^R&Mk"@@@5JHV@@@`_l\8[d@@@|3qZ_q@|JtEGK~H1I@@@>%{-7n]tv@H%@@@aeRpj)w臂lq:@OK.
GUyYY1_r.
@rJ^~9J]Zf^g,+IRDDZ'fIMj3"Zd/!
>^Z$Iei|-@{e[N#EEh|ST\n|J0Y9{s}dIKm')ZXZIb0Eq]l]vKal-&oMg~c6u$Pco@@a+mdQMUIDialog_multicheckablemenuQMUIDialog_multicheckablemenuimages40/47PNGIHDRp.
XsRGB@IDATx]Ga/*i{/Vn`+IHx!
b1c{ore[vWwnw[s9}L0@D6n&M4Dc@@^A@C=E@@@@d,d,@@@@@@@d,d,d,d,d,d,d,@d,d,d,d,d,d,d,d,@@d,d,d,d,d,d,d,@d,d,d,d,d,d,d,d,@@d,d,d,d,d,d,d,@d,d,d,d,d,d,d,d,@@d,d,d,d,d,d,d,@d,d,d,d,d,d,d,d,@@d,d,d,d,d,d,d,@d,@@@P@@(O>6l3{CEEExgxQMUIEmptyViewQMUIEmptyViewimages41/47PNGIHDR8]sRGB@IDATxK9V!
"gL69s`|clcpga&H"DJZ*F753=3=3tz^^PHHHHHHHHXwN$4p"/B^Gz4py$4p/B^Gz4py$4p/B^Gz4py$4p/B^Gz4py$4p/B^Gz4py$4p/B^G$dlxy4ZkW3kB$P/l5v`/feSK%Tr;laPd$@i!
mHZMo,]m,Xi64-\eV#$u]w3c1e0Q}QPe$#;\N.
l$@I#@Ganfp!
xvis:3Njr`^e%Rb[uI$8QoK^zq{Q}N_[Ht,i_+Yff3ey]Rg=G}Gxe#QMUIFloatLayoutQMUIFloatLayoutimages42/47PNGIHDR89^sRGB@IDATx|['vZ@@@@@Lo@@@(x9@GB@@@Hp@@@@Q@@@@@@@@Hp)x9@GB@@@Hp@@@@Q@@@@@@@@Hp)x9@GB@@@Hp@@@@Q@@@@@@@@Hp)x9@GB@@@Hp@@@@Q@@@@@@@@Hp)x9@GB@@@Hp@@@@Q@@@@@TuuZ]Cs@(r9N@T;=2uDB肖R9'y&0t@_7vp5y@@8Hpy(@(8+wLmFSV-rk2W^3kG@nk|ufu@Neiac5v+Iptrp@B@7j6uioSj*Hp5"xZwHj:t#X^Z>iYDw>Z>YP{mE.
M'kbuz[ft{~J8_l@l(C@Z^{]W-7kG@GHp(7C@0j*Qt2Sv@Q#@(r*G[|gE~wu9mMJQg@G'96@F\;6eUrZ,z\6{VH!
LN(ap*w%31jpu:XfMie>n/7uB,])*sTdd6=c$8[xY1Mk#wQMUITopBar_1QMUITopBar_1images43/47PNGIHDReW&sRGB@IDATx]>ttS)[QH!
)RQMUIVerticalTextViewQMUIVerticalTextViewimages44/47AndroidStudio3提供了LayoutInspector来帮助开发者做UI方面的debug.
在使用QMUI的过程中,如果出现布局方面的错误,如果可以的话,烦请提供下LayoutInspector文件:一.
点击Tools->LayoutInspector:一.
点击Tools->LayoutInspector:二.
选择process并执行二.
选择process并执行三.
在AndroidStudio左侧captures中可找到生成的LayoutInspector文件三.
在AndroidStudio左侧captures中可找到生成的LayoutInspector文件提供-Layout-Inspector-文件提供-Layout-Inspector-文件提供-Layout-Inspector-文件45/47QMUI的很多组件是依靠theme来进行样式管理的,目的就是为了全局控制,一修改,全局更新.
以QMUIPopup背景为例,背景是一张带阴影的9png,箭头是张单独的png,这样做的原因是便于动态处理箭头的位置.
而缺点也显而易见,要更换背景,就要同时更换二者以及和阴影相关的值.
(后期会用QMUILayout重构它,这样就不会存在和阴影相关的系列麻烦问题.
)如何更改背景:如何更改背景:我们需要在主题下覆盖一下几个item:@drawable/qmui_popup_bg@drawable/qmui_popup_arrow_down@drawable/qmui_popup_arrow_up13dp13dp这样就实现了QMUIPopup背景的配置.
然而这样并不能满足所有需求,不同的界面可能需要不同的背景,我们需要特殊化.
如何特殊化背景:如何特殊化背景:Android为我们提供了ContextThemeWrapper,基于Theme管理的样式,都可以利用ContextThemeWrapper来实现特殊化:首先,提供一份特殊化的style:@drawable/custom_popup_bg@drawable/qmui_popup_arrow_down@drawable/qmui_popup_arrow_up6dp6dp然后,按下面的方式构造QMUIPopup实例:Contextcontext=newContextThemeWrapper(getContext(),R.
style.
custom_popup);QMUIPopuppopup=newQMUIPopup(context,QMUIPopup.
DIRECTION_NONE);之后就是按原有方式使用组件了.
组件的全局配置与特殊处理组件的全局配置与特殊处理组件的全局配置与特殊处理46/47组件的全局配置与特殊处理47/47

萤光云(13.25元)香港CN2 新购首月6.5折

萤光云怎么样?萤光云是一家国人云厂商,总部位于福建福州。其成立于2002年,主打高防云服务器产品,主要提供福州、北京、上海BGP和香港CN2节点。萤光云的高防云服务器自带50G防御,适合高防建站、游戏高防等业务。目前萤光云推出北京云服务器优惠活动,机房为北京BGP机房,购买北京云服务器可享受6.5折优惠+51元代金券(折扣和代金券可叠加使用)。活动期间还支持申请免费试用,需提交工单开通免费试用体验...

totyun:香港cn2 vps,5折优惠,$6/月,10Mbps带宽,不限流量,2G内存/2核/20g+50g

totyun,新公司,主要运作香港vps、日本vps业务,接入cn2网络,不限制流量!VPS基于KVM虚拟,采用系统盘和数据盘分离,从4G内存开始支持Windows系统...大家注意下,网络分“Premium China”、“Global”,由于站长尚未测试,所以也还不清楚情况,有喜欢吃螃蟹的尝试过不妨告诉下站长。官方网站:https://totyun.com一次性5折优惠码:X4QTYVNB3P...

FBICDN,0.1元解决伪墙/假墙攻击,超500 Gbps DDos 防御,每天免费流量高达100G,免费高防网站加速服务

最近很多网站都遭受到了伪墙/假墙攻击,导致网站流量大跌,间歇性打不开网站。这是一种新型的攻击方式,攻击者利用GWF规则漏洞,使用国内服务器绑定host的方式来触发GWF的自动过滤机制,造成GWF暂时性屏蔽你的网站和服务器IP(大概15分钟左右),使你的网站在国内无法打开,如果攻击请求不断,那么你的网站就会是一个一直无法正常访问的状态。常规解决办法:1,快速备案后使用国内服务器,2,使用国内免备案服...

1u等于多少厘米为你推荐
Feldes37yw372:Com帮个忙 这个视频源地址怎么找http://video.kuaiji.com/congye/diansuanhua/372/3097php计划任务windows系统下如何设置PHP定时任务internetexplorer无法打开Internet Explorer 无法打开?tplink01cuteftp抢米网什么意思抢小米手机加多宝和王老吉王老吉和加多宝的区别温州商标注册温州注册商标需要注册公司吗加多宝与王老吉加多宝王老吉有什么区别吗?curl扩展linux上怎么操作开启php curl扩展
yardvps 息壤备案 bluehost 老左博客 realvnc debian6 anylink 域名转向 速度云 东莞数据中心 qq云端 上海联通宽带测速 卡巴斯基是免费的吗 yundun 中国电信测速器 西安服务器托管 上海电信测速 东莞服务器托管 西安主机 lamp架构 更多