Android学习笔记十二之Android基础UI三.docx
《Android学习笔记十二之Android基础UI三.docx》由会员分享,可在线阅读,更多相关《Android学习笔记十二之Android基础UI三.docx(17页珍藏版)》请在冰豆网上搜索。
Android学习笔记十二之Android基础UI三
Android学习笔记十二之Android基础UI三
ScrollView滚动视图
ScrollView是继承于FrameLayout,也是一个显示容器,由于手机屏幕是有限的,当需要组件安排多组信息的时候,ScrollView可以安排这些组件,我们浏览的时候可以进行滑动操作,滚动显示。
但是,需要注意的是,ScrollView只能包含一种组件。
实现代码:
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrollview);
tv_scrollview_show=(TextView)findViewById(R.id.tv_show);
btn_to_top=(Button)findViewById(R.id.btn_to_top);
btn_to_bottom=(Button)findViewById(R.id.btn_to_bottom);
scrollView=(ScrollView)findViewById(R.id.sc);
initData();
btn_to_top.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
scrollView.fullScroll(ScrollView.FOCUS_UP);
}
});
btn_to_bottom.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
}
privatevoidinitData(){
StringBufferbuffer=newStringBuffer();
for(inti=1;i<120;i++){
buffer.append("这是第"+i+"个条目"+"\n");
}
tv_scrollview_show.setText(buffer.toString());
}
效果图:
ScrollView就介绍到这里,这个不是很常用。
ProgressBar进度条
进度条在很多场景下都需要用到,在进行一些耗时操作,如果不做进度显示,用户会以为应用ANR,给用户造成不好的体验,所以需要用到进度条。
Android系统提供的进度条ProgressBar继承于View,有如下的属性:
android:
max:
进度条的最大值
android:
progress:
进度条已完成进度
android:
progressDrawable:
设置轨道对应的Drawable对象
android:
indeterminate:
如果设置成true,则进度条不精确显示进度
android:
indeterminateDrawable:
设置不显示进度的进度条的Drawable对象
android:
indeterminateDuration:
设置不精确显示进度的持续时间
android:
secondaryProgress:
二级进度条,类似于视频播放的一条是当前播放进度,一条是缓冲进度,前者通过progress属性进行设置!
对应Java方法有:
getMax():
获取这个进度条的上限
getProgress():
获取到当前进度
getSecondaryProgress():
获取次要进度
incrementProgressBy(intdiff):
指定增加的进度
isIndeterminate():
指示进度条是否处于不确定模式
setIndeterminate(booleanindeterminate):
设置进度条进入不确定模式
系统提供的进度条在这里就不多介绍了,比较简单,下面是自定义进度条的例子:
packagecom.example.hello_baseui.widget;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.RectF;
importandroid.graphics.Typeface;
importandroid.util.AttributeSet;
importandroid.view.View;
importcom.example.hello_baseui.R;
/**
*CreatedbyAdministratoron2016/6/29.
*/
publicclassCircleProgressBarextendsView{
/**
*画笔对象的引用
*/
privatePaintpaint;
/**
*圆环的颜色
*/
privateintcircleColor;
/**
*圆环进度的颜色
*/
privateintcircleProgressColor;
/**
*中间进度百分比的字符串的颜色
*/
privateinttextColor;
/**
*中间进度百分比的字符串的字体大小
*/
privatefloattextSize;
/**
*圆环的宽度
*/
privatefloatcircleWidth;
/**
*最大进度
*/
privateintmax;
/**
*当前进度
*/
privateintprogress;
/**
*是否显示中间的进度
*/
privatebooleanisShowProgressText;
/**
*进度的风格,实心或者空心
*/
privateintcircleStyle;
privatefloatstrokeWidth;
/**
*空心
*/
publicstaticfinalintSTROKE=0;
/**
*实心
*/
publicstaticfinalintFILL=1;
/**
*构造器
*
*@paramcontext
*/
publicCircleProgressBar(Contextcontext){
this(context,null);
}
/**
*构造器
*
*@paramcontext
*@paramattrs
*/
publicCircleProgressBar(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
/**
*构造器
*
*@paramcontext
*@paramattrs
*@paramdefStyleAttr
*/
publicCircleProgressBar(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
initView(context,attrs);
}
/**
*初始化组件
*
*@paramcontext
*@paramattrs
*/
privatevoidinitView(Contextcontext,AttributeSetattrs){
paint=newPaint();
TypedArraymTypedArray=context.obtainStyledAttributes(attrs,R.styleable.CircleProgressBar);
circleColor=mTypedArray.getColor(R.styleable.CircleProgressBar_circleColor,Color.RED);
circleProgressColor=mTypedArray.getColor(R.styleable.CircleProgressBar_circleProgressColor,Color.BLUE);
textColor=mTypedArray.getColor(R.styleable.CircleProgressBar_textColor,Color.BLUE);
textSize=mTypedArray.getDimension(R.styleable.CircleProgressBar_textSize,14);
circleWidth=mTypedArray.getDimension(R.styleable.CircleProgressBar_circleWidth,10);
isShowProgressText=mTypedArray.getBoolean(R.styleable.CircleProgressBar_isShowProgressText,true);
circleStyle=mTypedArray.getInt(R.styleable.CircleProgressBar_circleStyle,0);
mTypedArray.recycle();
}
/**
*绘制
*
*@paramcanvas
*/
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
//绘制最外层的大圆
intcentre=getWidth()/2;//获取圆心的x坐标
intradius=(int)(centre-circleWidth/2)-2;//圆环的半径
paint.setColor(circleColor);
paint.setStyle(Paint.Style.STROKE);//设置为空心
paint.setStrokeWidth(strokeWidth);//设置圆环的宽度
paint.setAntiAlias(true);//消除锯齿
canvas.drawCircle(centre,centre,radius,paint);//画出圆环
//===========================================================
//绘制进度的百分比
paint.setStrokeWidth(0);
paint.setColor(textColor);
paint.setTextSize(textSize);
paint.setTypeface(Typeface.DEFAULT_BOLD);//设置字体
intpercent=(int)(((float)progress/(float)max)*100);//中间的进度百分比,先转换成float在进行除法运算,不然都为0
floattextWidth=paint.measureText(percent+"%");//测量字体宽度,我们需要根据字体的宽度设置在圆环中间
if(isShowProgressText&&circleStyle==STROKE){
canvas.drawText(percent+"%",centre-textWidth/2,centre+textSize/2,paint);//画出进度百分比
}
//============================================================================
//绘制圆弧和进度
paint.setStrokeWidth(strokeWidth);//设置圆环的宽度
paint.setColor(circleProgressColor);//设置进度的颜色
RectFoval=newRectF(centre-radius-1,centre-radius-1,centre+radius+1,centre+radius+1);//用于定义的圆弧的形状和大小的界限
switch(circleStyle){
caseSTROKE:
{
paint.setStyle(Paint.Style.STROKE);
canvas.drawArc(oval,90,360*progress/max,false,paint);//根据进度画圆弧
break;
}
caseFILL:
{
paint.setStyle(Paint.Style.FILL_AND_STROKE);
if(progress!
=0)
canvas.drawArc(oval,90,360*progress/max,true,paint);//根据进度画圆弧
break;
}
}
}
//==============================getandset========================
/**
*设置进度的最大值
*
*@parammax
*/
publicsynchronizedvoidsetMax(intmax){
if(max<0){
thrownewIllegalArgumentException("Themaxcannotlessthan0");
}
this.max=max;
}
publicsynchronizedintgetMax(){
returnmax;
}
/**
*获取进度.需要同步
*
*@return
*/
publicsynchronizedintgetProgress(){
returnprogress;
}
/**
*设置进度,此为线程安全控件,由于考虑多线的问题,需要同步
*刷新界面调用postInvalidate()能在非UI线程刷新
*
*@paramprogress
*/
publicsynchronizedvoidsetProgress(intprogress){
if(ress<0){
thrownewIllegalArgumentException("Theprogresscannotlessthen0");
}
if(progress>max){
progress=max;
}
if(progress<=max){
this.progress=progress;
postInvalidate();
}
}
publicintgetCircleColor(){
returncircleColor;
}
/**
*设置圆环的颜色
*
*@paramcircleColor
*/
publicvoidsetCircleColor(intcircleColor){
this.circleColor=circleColor;
}
publicintgetTextColor(){
returntextColor;
}
/**
*设置圆环字体的颜色
*
*@paramtextColor
*/
publicvoidsetTextColor(inttextColor){
this.textColor=textColor;
}
publicfloatgetTextSize(){
returntextSize;
}
/**
*设置圆环字体的大小
*
*@paramtextSize
*/
publicvoidsetTextSize(floattextSize){
this.textSize=textSize;
}
publicfloatgetCircleWidth(){
returncircleWidth;
}
/**
*设置圆的宽度
*
*@paramcircleWidth
*/
publicvoidsetCircleWidth(floatcircleWidth){
this.circleWidth=circleWidth;
}
publicbooleanisShowProgressText(){
returnisShowProgressText;
}
/**
*设置是否显示进度百分比
*
*@paramshowProgressText
*/
publicvoidsetShowProgressText(booleanshowProgressText){
isShowProgressText=showProgressText;
}
publicintgetCircleStyle(){
returncircleStyle;
}
/**
*设置圆环的样式,空心和实心
*
*@paramcircleStyle
*/
publicvoidsetCircleStyle(intcircleStyle){
this.circleStyle=circleStyle;
}
publicfloatgetStrokeWidth(){
returnstrokeWidth;
}
/**
*设置绘制圆环的宽度
*@paramstrokeWidth
*/
publicvoidsetStrokeWidth(floatstrokeWidth){
this.strokeWidth=strokeWidth;
}
publicintgetCircleProgressColor(){
returncircleProgressColor;
}
/**
*设置绘制圆环进度的颜色
*@paramcircleProgressColor
*/
publicvoidsetCircleProgressColor(intcircleProgressColor){
this.circleProgressColor=circleProgressColor;
}
//==============================getandset========================
}
使用例子:
布局文件代码:
xmlversion="1.0"encoding="utf-8"?
>
android:
layout_width="match_parent"
android:
layout_height="match_parent"
android:
orientation="vertical">
android:
id="@+id/cpb"
android:
layout_width="100dp"
android:
layout_height="100dp"
android:
layout_marginLeft="10dp"
android:
layout_marginTop="10dp"
android_custom:
circleColor="#D1D1D1"
android_custom:
textSize="20sp"/>
Java代码:
privateCircleProgressBarcircleProgressBar;
intprogressStatus=0;
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_progressbar);
circleProgressBar=(CircleProgressBar)findViewById(R.id.cpb);
circleProgressBar.setMax(00);
circleProgressBar.setCircleWidth(30);
circleProgressBar.setStrokeWidth(10);
circleProgressBar.setCircleProgressColor(Color.BLUE);
finalHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==0){
circleProgressBar.setProgress(progressStatus);
}
}
};
newThread(newRunnable(){
@Override
publicvoidrun(){
while(progressStatus<100){
progressStatus+=3;
try{
Thread.sleep(1000);
handler.sendEmptyMessage(0);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}).start();
}
实现效果图:
SeekBar拖动条
SeekBar