首页 > 其他分享 >Android控件TextProgressBar进度条上显文字

Android控件TextProgressBar进度条上显文字

时间:2023-03-20 10:06:52浏览次数:35  
标签:TextProgressBar 控件 mChronometer 进度条 int mProgressBar params child Chronometer


Android系统的进度条控件默认的设计的不是很周全,比如没有包含文字的显示,那么如何在Android进度条控件上显示文字呢? 来自Google内部的代码来了解下,主要使用的addView这样的方法通过覆盖一层Chronometer秒表控件来实现,整个代码如下

 

public class TextProgressBar extends RelativeLayout implements OnChronometerTickListener {
public static final String TAG = "TextProgressBar";

static final int CHRONOMETER_ID = android.R.id.text1;
static final int PROGRESSBAR_ID = android.R.id.progress;

Chronometer mChronometer = null;
ProgressBar mProgressBar = null;

long mDurationBase = -1;
int mDuration = -1;

boolean mChronometerFollow = false;
int mChronometerGravity = Gravity.NO_GRAVITY;

public TextProgressBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public TextProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
}

public TextProgressBar(Context context) {
super(context);
}

//Android开发网提示关键部分在这里


@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
super.addView(child, index, params);

int childId = child.getId();
if (childId == CHRONOMETER_ID && child instanceof Chronometer) {
mChronometer = (Chronometer) child;
mChronometer.setOnChronometerTickListener(this);

// Check if Chronometer should move with with ProgressBar
mChronometerFollow = (params.width == ViewGroup.LayoutParams.WRAP_CONTENT);
mChronometerGravity = (mChronometer.getGravity() & Gravity.HORIZONTAL_GRAVITY_MASK);

} else if (childId == PROGRESSBAR_ID && child instanceof ProgressBar) {
mProgressBar = (ProgressBar) child;
}
}


@android.view.RemotableViewMethod
public void setDurationBase(long durationBase) {
mDurationBase = durationBase;

if (mProgressBar == null || mChronometer == null) {
throw new RuntimeException("Expecting child ProgressBar with id " +
"'android.R.id.progress' and Chronometer id 'android.R.id.text1'");
}

// Update the ProgressBar maximum relative to Chronometer base
mDuration = (int) (durationBase - mChronometer.getBase());
if (mDuration <= 0) {
mDuration = 1;
}
mProgressBar.setMax(mDuration);
}


public void onChronometerTick(Chronometer chronometer) {
if (mProgressBar == null) {
throw new RuntimeException(
"Expecting child ProgressBar with id 'android.R.id.progress'");
}

// Stop Chronometer if we're past duration
long now = SystemClock.elapsedRealtime();
if (now >= mDurationBase) {
mChronometer.stop();
}


int remaining = (int) (mDurationBase - now);
mProgressBar.setProgress(mDuration - remaining);


if (mChronometerFollow) {
RelativeLayout.LayoutParams params;


params = (RelativeLayout.LayoutParams) mProgressBar.getLayoutParams();
int contentWidth = mProgressBar.getWidth() - (params.leftMargin + params.rightMargin);
int leadingEdge = ((contentWidth * mProgressBar.getProgress()) /
mProgressBar.getMax()) + params.leftMargin;


int adjustLeft = 0;
int textWidth = mChronometer.getWidth();
if (mChronometerGravity == Gravity.RIGHT) {
adjustLeft = -textWidth;
} else if (mChronometerGravity == Gravity.CENTER_HORIZONTAL) {
adjustLeft = -(textWidth / 2);
}


leadingEdge += adjustLeft;
int rightLimit = contentWidth - params.rightMargin - textWidth;
if (leadingEdge < params.leftMargin) {
leadingEdge = params.leftMargin;
} else if (leadingEdge > rightLimit) {
leadingEdge = rightLimit;
}

params = (RelativeLayout.LayoutParams) mChronometer.getLayoutParams();
params.leftMargin = leadingEdge;


mChronometer.requestLayout();

}
}
}

标签:TextProgressBar,控件,mChronometer,进度条,int,mProgressBar,params,child,Chronometer
From: https://blog.51cto.com/u_5454003/6131796

相关文章

  • web自动化-js处理日历控件
    一、基础知识:  """js处理日历控件利用js去掉readonly属性,然后直接输入时间--利用js代码获取当前元素--设置readonly这个属性值为false(或者删除readonly属性)"""......
  • nprogress进度条插件的使用
    发送请求时,浏览器展示进度条安装插件[email protected]在封装axios的地方使用//对于axios进行二次封测importaxiosfrom'axios';importnProgr......
  • 【Android开发】范例1-显示在标题上的进度条
    实现一个界面,实现在向页面添加图片时,在标题上显示一个水平进度条,当图片载入完毕后,隐藏进度条并显示图片具体实现方法:res/layout/main.xml:<Linea......
  • sencha-touch2.0控件nestlist的简单用法
    通过nestlist可以自定义一个有标题到内容的一个组合布局如图<font><font>Ext.create(的“Ext.tab.Panel”,{</font></font><font></font><font><font>全屏:真实,<......
  • SerialPort控件的详细用法
    SerialPort控件的详细用法属性如下:BaudRate:波特率DataBits:数据位Parity:奇偶校验位PortName:端口号StopBits:停止位ByteToRead:获取输入缓冲区的IsOpen:获取是否开启串......
  • 界面控件DevExpress WinForms的数据网格,让业务数据管理更轻松!
    DevExpressWinForms控件的DataGrid组件是一个性能优异的编辑/数据整型组件,附带了数十个高影响力的功能,用户可以轻松地管理信息并根据业务需求来展示数据信息。PS:DevExpr......
  • android studio之常用基本控件的使用
    转自:(7条消息)androidstudio之常用基本控件的使用_androidstudio控件栏_PPYY3344的博客-CSDN博客在Android开发中,需要使用的控件很多,除了TextView、Button、EditText......
  • wpf自定义控件库(二)——伪3D按钮
    1、以学习wpf为目的,同时也为了增加控件代码的复用性,开始建立自己的自定义控件库;2、目前主要是根据项目需求去增加,完善控件库。希望之后能一步步扩展更多更丰富的控件;3、......
  • pageOffice控件实现在线编辑Word 只能加批注的功能
    OA办公中,业务需要编辑打开word文档后文档的正文不能改变,只能对文档进行加批注的操作怎么实现编辑打开word文档后文档的正文不能改变,只能对文档进行加批注的操作呢?#1、......
  • wpf 自定义控件库(一)
    1、以学习wpf为目的,同时也为了增加控件代码的复用性,开始建立自己的自定义控件库;2、目前主要是根据项目需求去增加,完善控件库。希望之后能一步步扩展更多更丰富的控件;3、......