Android 自定义View——动态进度条
progressbar的用法
progressbar的用法ProgressBar 是 Android 平台中常用的一个视图控件,它用于显示一个表示进度的动态条,可以用于展示下载、上传、转换等操作的进度。
ProgressBar 支持多种样式,如水平进度条、圆形进度条等,而且还可以自定义样式,非常灵活和实用。
本文将介绍 ProgressBar 控件的用法和实例。
一、ProgressBar 控件的属性ProgressBar 控件最常用的属性如下表所示:| 属性名称 | 描述 | | --- | --- | | android:id | 控件的唯一 id | | android:layout_width | 控件的宽度 | | android:layout_height | 控件的高度 | | android:layout_margin | 控件的外边距 | |android:max | 进度条的最大值 | | android:progress | 进度条的当前值 | | android:progressDrawable | 进度条的背景 | | android:secondaryProgress | 二级进度的当前值 | | android:indeterminate | 是否在不知道进度时显示一个不确定的进度条 | |android:indeterminateDrawable | 不确定进度条的图象资源 | | android:indeterminateDuration | 不确定进度条的动画时长 | | android:minWidth | 进度条的最小宽度 | | android:minHeight | 进度条的最小高度 | | android:visibility | 控件的可见性 |ProgressBar 的属性可用于配置进度条的样式和行为,下面将介绍其中一些重要的属性。
1. max 和 progressmax 属性用于设置进度条的最大值,progress 属性用于设置进度条的当前进度值。
Android使用Kotlin实现多节点进度条
Android使⽤Kotlin实现多节点进度条时间轴主要使⽤Recyclerview来实现。
开发语⾔使⽤Kotlin,代码相对java少了许多也简洁许多源代码效果图:MainActivity.ktpackage com.example.lee.linenodeimport android.annotation.SuppressLintimport android.os.Buildimport android.support.v7.app.AppCompatActivityimport android.os.Bundleimport android.support.v7.widget.LinearLayoutManagerimport kotlinx.android.synthetic.main.activity_main.*import kotlinx.android.synthetic.main.item_line_node.view.*class MainActivity : AppCompatActivity() {private var list = arrayListOf<StepBean>()private var lineNodeAdapter: LineNodeAdapter<StepBean>? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(yout.activity_main)initRecyclerView()}private fun initRecyclerView() {getData()//创建⼀个继承于抽象类(LineNodeAdapter)的实例lineNodeAdapter = object : LineNodeAdapter<StepBean>(this, list) {override fun convert(viewHolder: LineNodeViewHolder, t: StepBean) {viewHolder.itemView.title_txt.text = t.titleviewHolder.itemView.time_txt.text = t.timeviewHolder.itemView.num_txt.text = t.num.toString()if (t.num == 1) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {viewHolder.itemView.left_view.background = null}}if (t.num == 4) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {viewHolder.itemView.right_view.background = null}}if (t.num < 3) viewHolder.itemView.num_txt.setBackgroundResource(R.drawable.shap_line_number_circle_red)}}val linearLayoutManager = LinearLayoutManager(this)linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL//使⽤来⾃主代码集的 yout.activity_main,⽽不是 findViewById(R.id.ln_recycler_view) as Recyclerviewln_recycler_youtManager = linearLayoutManagerln_recycler_view.adapter = lineNodeAdapter}private fun getData() {for (i in 1..4) {list.add(StepBean(i, "2017-9-27\n17:1$i", "步骤$i"))}}}activity_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/ln_recycler_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true" /></RelativeLayout>LineNodeAdapter.kt //RecyclerView的适配器package com.example.lee.linenodeimport android.content.Contextimport android.support.v7.widget.RecyclerViewimport android.support.v7.widget.RecyclerView.Adapterimport youtInflaterimport android.view.Viewimport android.view.ViewGroupimport kotlinx.android.synthetic.main.item_line_node.view.*/*** Created by lee on 17-9-27.*/abstract class LineNodeAdapter<T>(val context: Context, val list: List<T>) : Adapter<LineNodeAdapter.LineNodeViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): LineNodeViewHolder {return LineNodeViewHolder(LayoutInflater.from(context).inflate(yout.item_line_node, parent, false))}override fun onBindViewHolder(viewHolder: LineNodeViewHolder, position: Int) {convert(viewHolder, list.get(position))}abstract fun convert(viewHolder: LineNodeViewHolder, t: T)override fun getItemCount(): Int {return list.size}class LineNodeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {}}item_line_node.xml //这个⽂件是时间轴item的布局⽂件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:orientation="vertical"><TextViewandroid:id="@+id/title_txt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="步骤" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:gravity="center_vertical"android:orientation="horizontal"><Viewandroid:id="@+id/left_view"android:layout_width="30dp"android:layout_height="1dp"android:layout_centerVertical="true"android:background="#A6A6A6" /><TextViewandroid:id="@+id/num_txt"android:layout_width="20dp"android:layout_height="20dp"android:background="@drawable/shap_line_number_circle_grey"android:gravity="center"android:text="1"android:textColor="@color/colorWhite" /><Viewandroid:id="@+id/right_view"android:layout_width="30dp"android:layout_height="1dp"android:layout_centerVertical="true"android:background="#A6A6A6" /></LinearLayout><TextViewandroid:id="@+id/time_txt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:gravity="center_horizontal"android:text="2017-09-27\n15:56" /></LinearLayout>StepBean.kt //时间节点实体类package com.example.lee.linenode/*** Created by lee on 17-9-27.*/class StepBean(var num: Int, var time: String, var title: String)//直接在主构造函数⾥声明属性以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android编程实现自定义ProgressBar样式示例(背景色及一级、二级进度条颜色)
Android编程实现⾃定义ProgressBar样式⽰例(背景⾊及⼀级、⼆级进度条颜⾊)本⽂实例讲述了Android编程实现⾃定义ProgressBar样式。
分享给⼤家供⼤家参考,具体如下:效果图如下,本例中设置了第⼀级进度条和第⼆级进度条。
样式资源:progressbar_bg.xml,放在drawable⽂件夹下:<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android"><!--3个层的顺序即为显⽰时的叠加顺序--><!--背景⾊--><item android:id="@android:id/background"><shape><corners android:radius="5dip" /><solid android:color="#CCCCCC" /></shape></item><!--⼆级进度条的颜⾊--><item android:id="@android:id/secondaryProgress"><clip><shape><corners android:radius="5dip" /><solid android:color="#88F56100" /></shape></clip></item><!--⼀级进度条的颜⾊,也可以直接替换成图⽚--><item android:id="@android:id/progress"><clip><shape><corners android:radius="5dip" /><solid android:color="#F56100" /></shape></clip></item></layer-list>布局代码:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ProgressBarandroid:id="@+id/progress_bar"style="?android:attr/progressBarStyleHorizontal"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="100dp"android:minHeight="20dp"android:padding="10dp"android:progressDrawable="@drawable/progressbar_bg" /></LinearLayout>更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
Android自定义进度条-带文本(文字进度)的水平进度条(ProgressBar)
Android⾃定义进度条-带⽂本(⽂字进度)的⽔平进度条(ProgressBar)⽔平进度条,显⽰进度的⽂本随着进度⽽移动。
效果如下,截的静态图。
代码如下 TextProgressBar.javapublic class TextProgressBar extends ProgressBar {private Paint mPaint;private String text;private float rate;public TextProgressBar(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinitView();}public TextProgressBar(Context context) {super(context);initView();}private void initView() {mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setColor(Color.BLUE);}@Overridepublic synchronized void setProgress(int progress) {setText(progress);super.setProgress(progress);}private void setText(int progress) {rate = progress * 1.0f / this.getMax();int i = (int) (rate * 100);this.text = String.valueOf(i) + "%";}@Overrideprotected synchronized void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);Rect rect = new Rect();mPaint.getTextBounds(text, 0, this.text.length(), rect);// int x = (getWidth()/2) - rect.centerX();// int y = (getHeight()/2) - rect.centerY();int x = (int) (getWidth() * rate);if (x == getWidth()) {// 如果为百分之百则在左边绘制。
android setprogressdrawable用法 -回复
android setprogressdrawable用法-回复Android的setProgressDrawable()方法是用于设置进度条的Drawable 样式的。
进度条是在Android应用程序中常用的一种视图,用于显示任务或操作的进度。
setProgressDrawable()方法有两个参数,分别是start和end。
start 参数是一个Drawable对象,表示进度条的开始部分的样式;end参数是一个Drawable对象,表示进度条的结束部分的样式。
要使用setProgressDrawable()方法,首先需要创建一个进度条的样式。
可以使用XML定义样式,也可以使用代码创建Drawable对象。
下面将详细介绍这两种方式。
一、使用XML定义样式1. 创建一个名为progress_bar_style.xml的XML文件,放在res/drawable文件夹下。
2. 在progress_bar_style.xml文件中,定义进度条的样式。
可以使用<layer-list>标签来定义多层次的Drawable对象。
例如,下面的XML代码定义了一个带有两层样式的进度条:xml<layer-list xmlns:android="<item android:id="@android:id/background"android:drawable="@drawable/progress_background" /> <item android:id="@android:id/progress"android:drawable="@drawable/progress_bar" /></layer-list>这个样式包含了两个Drawable对象。
第一个是ID为android:id/background的Drawable对象,表示进度条的背景部分的样式;第二个是ID为android:id/progress的Drawable对象,表示进度条的进度部分的样式。
Android自定义SeekBar实现视频播放进度条
Android⾃定义SeekBar实现视频播放进度条本⽂实例为⼤家分享了Android实现视频播放进度条的具体代码,供⼤家参考,具体内容如下⾸先来看⼀下效果图,如下所⽰:其中进度条如下:接下来说⼀说我的思路,上⾯的进度拖动条有⾃定义的Thumb,在Thumb正上⽅有⼀个PopupWindow窗⼝,窗⼝⾥⾯显⽰当前的播放时间。
在SeekBar右边有⼀个⽂本框显⽰当前播放时间/总时间。
step1、先来看⼀看PopupWindow的布局⽂件,seek_popu.xml,效果如下图所⽰:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/seek_dialog_bg" ><!-- 展现当前播放进度时间的⽂本框--><TextViewandroid:id="@+id/dialogSeekTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dip"android:layout_marginTop="12dip"android:text="@string/unknow_seek_time"android:textColor="@color/black"android:textSize="12sp" /></RelativeLayout>step2、⾃定义⼀个SeekBarimport com.canplay.video.R;import android.content.Context;import android.util.AttributeSet;import youtInflater;import android.view.View;import android.widget.PopupWindow;import android.widget.SeekBar;import android.widget.TextView;/*** ⾃定义进度拖动条控件*/public class MySeekBar extends SeekBar {/*** 定义⼀个展现时间的PopupWindow*/private PopupWindow mPopupWindow;private View mView;/*** 显⽰时间的TextView*/private TextView dialogSeekTime;/*** ⽤来表⽰该组件在整个屏幕内的绝对坐标,其中 mPosition[0] 代表X坐标,mPosition[1] 代表Y坐标。
Android实现带节点的进度条
Android实现带节点的进度条⽇常的开发中经常会需要⽤到⾃定义View,这次刚好有个需求,需要⽤到带有节点的进度条。
东西很简单直接继承View就⾏了。
⾸先定义⼀些需要的属性/*** 背景画笔*/private Paint bgPaint;/*** 前景画笔*/private Paint forePaint;/*** 选中画笔*/private Paint selectPaint;/*** 未选中画笔*/private Paint unselectPaint;/*** 背景颜⾊*/private int bgColor = Color.parseColor("#9C9C9C");/*** 前景颜⾊*/private int foreColor = Color.parseColor("#8A2BE2");/*** 默认⾼度*/private int defaultHeight;/*** 节点⽂字*/private List<String> nodeList;private List<Rect> mBounds;/*** 节点圆的半径*/private int radius;/*** ⽂字和节点进度条的top*/private int marginTop;/*** 两个节点之间的距离*/private int dividWidth;/*** 选中位置*/private int selectIndex;然后在构造⽅法中初始化这些数据private void init(Context context) {radius = SizeUtils.dp2px(context,4);defaultHeight = SizeUtils.dp2px(context,30);marginTop = SizeUtils.dp2px(context,5);bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);bgPaint.setColor(bgColor);bgPaint.setStyle(Paint.Style.FILL);forePaint = new Paint(Paint.ANTI_ALIAS_FLAG);forePaint.setColor(foreColor);forePaint.setStyle(Paint.Style.FILL);unselectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);unselectPaint.setColor(bgColor);unselectPaint.setTextSize(SizeUtils.sp2px(context,10));selectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);selectPaint.setColor(foreColor);selectPaint.setTextSize(SizeUtils.sp2px(context,10));}设置节点⽂字/*** 设置数据* @param nodeDatas*/public void setNodeList(List<String> nodeDatas){if(nodeDatas != null){nodeList = nodeDatas;}//测量⽂字所占⽤的空间measureText();}/*** 设置选中位置* @param selectIndex*/public void setSelectIndex(int selectIndex){this.selectIndex = selectIndex;invalidate();}/*** 测量⽂字的长宽*/private void measureText(){mBounds = new ArrayList<>();for (int i = 0; i < nodeList.size(); i++) {Rect mBound = new Rect();unselectPaint.getTextBounds(nodeList.get(i),0,nodeList.get(i).length(),mBound); mBounds.add(mBound);}}最后重要的步骤,开始在onDraw中绘制节点进度条和绘制⽂字1、绘制灰⾊背景线条if(nodeList == null || nodeList.isEmpty()){return;}bgPaint.setStrokeWidth(radius/2);//绘制灰⾊的背景线条canvas.drawLine(radius,radius,getWidth()-radius,radius,bgPaint);2、绘制节点上的圆和两个节点之间的间隔线条//画节点圆//每个圆相隔的距离dividWidth = (getWidth()-radius*2)/(nodeList.size() - 1);forePaint.setStrokeWidth(radius/2);for (int i = 0; i < nodeList.size(); i++) {if(i == selectIndex){for (int j = 0; j <= i; j++) {canvas.drawCircle(radius+ j * dividWidth, radius, radius , forePaint);canvas.drawLine(radius,radius,j*dividWidth,radius,forePaint);}}else if(i>selectIndex){canvas.drawCircle(radius + i * dividWidth, radius, radius, bgPaint);}}3、绘制节点上的⽂字for (int i = 0; i < nodeList.size(); i++) {int currentTextWidth=mBounds.get(i).width();if (i==0){if (i==selectIndex){canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint);}else if(i>selectIndex) {canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint);}}else if (i==nodeList.size()-1){if (i==selectIndex){for (int j = 0; j <= i; j++) {if(j == 0){canvas.drawText(nodeList.get(j), 0, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint);}else if(j == i){canvas.drawText(nodeList.get(j), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint);}else{canvas.drawText(nodeList.get(j), radius + j * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); }}}else if(i>selectIndex) {canvas.drawText(nodeList.get(i), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint);}}else {if (i==selectIndex){for (int j = 0; j <= i; j++) {if(j>0){canvas.drawText(nodeList.get(j), radius + j * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); }else{canvas.drawText(nodeList.get(j), 0, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint);}}}else if(i>selectIndex) {canvas.drawText(nodeList.get(i), radius + i * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); }}}有时候可能需要的是下⾯这种进度条只需要修改onDraw中绘制节点圆和⽂字的⽅法就可以了for (int i=0; i < nodeList.size();i++) {if (i==selectIndex){canvas.drawCircle(radius+ i * dividWidth, radius, radius , forePaint);}else {canvas.drawCircle(radius + i * dividWidth, radius, radius, bgPaint);}}for (int i=0; i<nodeList.size();i++){int currentTextWidth=mBounds.get(i).width();if (i==0){if (i==selectIndex){canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint);}else {canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint);}}else if (i==nodeList.size()-1){if (i==selectIndex){canvas.drawText(nodeList.get(i), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint);}else {canvas.drawText(nodeList.get(i), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint);}}else {if (i==selectIndex){canvas.drawText(nodeList.get(i), radius + i * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint); }else {canvas.drawText(nodeList.get(i), radius + i * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); }}}点击节点进⾏节点切换// 实现节点切换,把注释打开就⾏了@Overridepublic boolean onTouchEvent(MotionEvent event) {float eventX;float eventY;int i = event.getAction();if (i == MotionEvent.ACTION_DOWN) {} else if (i == MotionEvent.ACTION_MOVE) {} else if (i == MotionEvent.ACTION_UP) {eventX = event.getX();eventY = event.getY();//计算选中的indexfloat select = eventX / dividWidth;float xs = select - (int) (select);//selectIndex = (int) select + (xs > 0.5 ? 1 : 0);}//invalidate();return true;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
android setprogressdrawable用法
android setprogressdrawable用法Android SetProgressDrawable是一个用于设置进度条样式的API,它允许您自定义进度条的外观和样式。
通过使用SetProgressDrawable,您可以根据需要创建自定义进度条样式,并与其他应用程序界面元素集成。
SetProgressDrawable提供了几个不同的方法,可以用于设置自定义进度条样式。
以下是一些基本用法:1. 使用ProgressDrawable类ProgressDrawable类是SetProgressDrawable的基础,它提供了用于创建自定义进度条样式的各种方法。
您可以使用ProgressDrawable类创建进度条,并使用SetProgressDrawable将其应用于Activity或Fragment中的ProgressBar组件。
示例代码:```javaProgressDrawable drawable = (ProgressDrawable) progressBar.getIndeterminateDrawable();drawable.start(); // 启动进度条```2. 使用setCurrent方法您可以使用setCurrent方法设置进度条的当前值,以控制进度条的显示范围。
通过将进度条设置为特定的百分比值,您可以控制进度条的显示样式。
示例代码:```javaint progress = 50; // 设置进度条的百分比值progressBar.setProgress(progress); // 设置进度条当前值```3. 使用setBuilder方法SetProgressDrawable提供了一个Builder类,用于构建自定义进度条样式。
您可以使用Builder类设置进度条的颜色、大小、背景等属性,以创建具有自定义样式的进度条。
示例代码:```javaSetProgressDrawable.Builder builder = new SetProgressDrawable.Builder(context);builder.color(Color.RED) // 设置进度条颜色.size(100) // 设置进度条宽度和高度.background(R.drawable.progress_background); // 设置背景图片ProgressDrawable drawable = builder.create(); // 创建自定义进度条样式progressBar.setProgressDrawable(drawable); // 将自定义样式应用于ProgressBar组件```二、注意事项在使用SetProgressDrawable时,请注意以下几点:1. SetProgressDrawable仅适用于ProgressBar组件,不适用于SeekBar组件。
android 常见view的用法
android 常见view的用法常见的Android View的用法有:1. TextView(文本视图):用于显示文本内容,可以设置字体、颜色、字体大小等属性。
2. ImageView(图片视图):用于显示图片,可以设置图片资源、缩放类型、背景等属性。
3. Button(按钮):用于触发点击事件,可以设置文本、背景、点击效果等属性。
4. EditText(编辑文本视图):用于输入文本内容,可以设置提示文本、输入类型、最大长度等属性。
5. RadioButton(单选按钮):用于在多个选项中选择一个,可以设置文本、选中状态等属性。
6. CheckBox(复选框):用于在多个选项中选择多个,可以设置文本、选中状态等属性。
7. ProgressBar(进度条):用于显示操作进度,可以设置进度值、样式、颜色等属性。
8. SeekBar(滑动条):用于选择数值范围,可以设置最小值、最大值、当前值等属性。
9. ListView(列表视图):用于显示大量数据列表,可以自定义每一项的布局和交互。
10. GridView(网格视图):用于显示数据的表格布局,可以自定义每个单元格的布局和交互。
11. RecyclerView(可复用列表视图):Android的推荐使用的列表视图,功能更强大、性能更优。
12. WebView(网页视图):用于显示网页内容,可以加载本地或远程网页。
13. ScrollView(滚动视图):用于包裹超出屏幕大小的内容,并通过滑动来查看全部内容。
14. LinearLayout(线性布局):用于按照水平或垂直方向排列子视图。
15. RelativeLayout(相对布局):用于按照相对位置摆放子视图,灵活性更高。
16. FrameLayout(帧布局):用于叠加子视图,通常用于显示单个子视图或切换视图。
这些是Android中常见的View,开发者可以根据实际需求选择合适的View并设置相应的属性,实现各种不同的界面效果。
Android自定义控件:进度条的四种实现方式(ProgressWheel的解析)
Android⾃定义控件:进度条的四种实现⽅式(ProgressWheel的解析)最近⼀直在学习⾃定义控件,搜了许多⼤⽜们Blog⾥分享的⼩教程,也上GitHub找了⼀些类似的控件进⾏学习。
发现读起来都不太好懂,就想写这么⼀篇东西作为学习笔记吧。
⼀、控件介绍:进度条在App中⾮常常见,例如下载进度、加载图⽚、打开⽂章、打开⽹页等等……都需要这么⼀个效果让⽤户知道我们的App正在读取,以构造良好的交互。
如果没有这样⼀个效果的话,⽤户没法知道东西有没有下载好、图⽚加载了没有、⽂章打开了没……会让⽤户很不爽。
基于这样的情景我们的UI设计师们创造了这样⼀个控件。
⼆、这篇⽂章会涉及的知识点:跟我⼀样刚⼊门的Android菜鸟们,我推荐⼤家先了解⼀下这些知识点再往下看。
这些知识点我也会推荐⼀些博客给⼤家看看,更推荐⼤家看⽂档⾥的解释,当然⼤⽜们可以直接⽆视……1、ClipDrawable类:能够对⼀个drawable类进⾏剪切操作(即只显⽰某⼀部分的区域,另⼀部分隐藏),显⽰多⼤的区域由level控制(level取值是0~10000)【博客:/lonelyroamer/article/details/8244777】、没⽂档的可以在这看【/api/android/ClipDrawable.html】2、⾃定义View:guolin⼤神的深⼊学习View四部曲【 —— /guolin_blog/article/details/12921889】【 —— /guolin_blog/article/details/16330267】【 —— /guolin_blog/article/details/17045157】——/guolin_blog/article/details/17357967】3、没看过我写的:Android⾃定义控件——⽼版优酷三级菜单的话,或许需要看看这个:【RotateAnimation详解——】三、Android上的实现⽅式:(前三种⽅法⽐较简单,第四种⽅法是GitHub项⽬的解析,对前三种没兴趣可以直接跳到后边……)1、效果图:将进度条的变换过程分解为⼀帧⼀帧的图⽚,将这些⼀帧⼀帧的图⽚连起来构成⼀个动画。
Android ProgressBar自定义图片进度,自定义渐变色进度条
1 2 3 4 5 6 7 ng.Object↳ android.view.View↳ android.widget.ProgressBar 直接子类AbsSeekBar间接子类RatingBar, SeekBar在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。
一个进度条也可不确定其进度。
在不确定模式下,进度条显示循环动画。
这种模式常用于应用程序使用任务的长度是未知的。
进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中1、android.widget. ProgressBar,继承自android.view.View 。
在android.widget包中。
对应对话框ProgressDialog。
ProgressBar有两种展示方式,表盘形式(普通、小、大)和条形填充形式。
在layout定义时,需要通过设施style属性类设置展示方式。
ProgressBar的样式有四种:android:progressBarStyle:默认进度条样式,不确定模式android:progressBarStyleHorizontal:水平进度条样式android:progressBarStyleLarge :大号进度条样式,也是不确定进度模式android:progressBarStyleSmall :小号进度条样式,也是不确定进度模式二、XML重要属性android:max-- 这事进度条长度最大值android:progress--设定度条当前进度值android:secondaryProgress--第二进度条进度值android:progressBarStyle:默认进度条样式android:progressBarStyleHorizontal:水平样式style="?android:attr/progressBarStyleLarge" --- 属性风格类型--大圆圈,如下图style=”?android:attr/progressBarStyleSmall”--- 属性风格类型--小圆圈,如下图:style="?android:attr/progressBarStyleHorizontal" --水平进度条 --如下图:几秒钟之后自动滚到到如下:也可以用下面的形式代替上面的形式的:? 1 2 3 <ProgressBar style="@android:style/Widget.ProgressBar.Inverse"/>//中<ProgressBar style="@android:style/rge.Inverse"/> //大圆 <ProgressBar style="@android:style/Widget.ProgressBar.Small.Inverse"/> //小圆三、重要方法getMax():返回这个进度条的范围的上限getProgress():返回当前进度值getSecondaryProgress():返回次要当前进度值incrementProgressBy(int diff):指定增加的进度--即步长isIndeterminate():指示进度条是否在不确定模式下setIndeterminate(boolean indeterminate):设置不确定模式下setVisibility(int v):设置该进度条是否可视四、重要事件onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件接下来看案例:1.定义一个布局文件progressbar.xml?1234 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="/apk/res/android" android:layout_width="fill_parent"6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/startText"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="垂直的----标题上面也有一个进度条哦"android:textColor="#CD0000"android:background="#BC8F8F"/><!-- style=”?android:attr/progressBarStyleLarge”大圆圈 --><ProgressBarandroid:id="@+id/progtessBer_btn_id1"android:layout_width="wrap_content"android:layout_height="wrap_content"style="?android:attr/progressBarStyleLarge"/><!-- style=”?android:attr/progressBarStyleSmall”小圆圈 --><ProgressBarandroid:layout_width="wrap_content"android:layout_height="wrap_content"style="?android:attr/progressBarStyleSmall"android:layout_gravity="center_horizontal"/><TextViewandroid:id="@+id/startText1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="水平的"android:textColor="#aaaaaa"/><!-- style="?android:attr/progressBarStyleHorizontal" 水平进度条 --> <ProgressBarandroid:id="@+id/progtessBer_btn_id2"android:layout_width="fill_parent"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"/><TextViewandroid:layout_width="fill_parent"50515253android:text="@string/progress_text"/></LinearLayout></ScrollView>2.之后定义java文件:ProgressBarDemo.java ?1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031323334353637 package com.dream.app.start.first.prograssbar;import com.dream.app.start.MenuDemo;import com.dream.app.start.R;import com.dream.app.start.R.id;import yout;import com.dream.app.start.utils.PublicClass;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.text.method.ScrollingMovementMethod;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;public class ProgressBarDemo extends PublicClass {private ProgressBar progressbar,progressbar_1;Button btn1,btn2;private int prostatus=0;//创建一个handler对象private Handler handler=new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//在标题条里放置进度条。
Android三种方式实现ProgressBar自定义圆形进度条
Android三种⽅式实现ProgressBar⾃定义圆形进度条进度条样式在项⽬中经常可以见到,下⾯⼩编给⼤家分享Android三种⽅式实现ProgressBar⾃定义圆形进度条。
Android进度条有4种风格可以使⽤。
默认值是progressBarStyle。
设置成progressBarStyleSmall后,图标变⼩。
设置成progressBarStyleLarge后,图标变⼤设置成progressBarStyleHorizontal后,变成横向长⽅形。
⾃定义圆形进度条ProgressBar的⼀般有三种⽅式:⼀、通过动画实现定义res/anim/loading_anim.xml如下:<?xml version="1.0" encoding="utf-8"?><animation-list android:oneshot="false"xmlns:android="/apk/res/android"><item android:duration="150" android:drawable="@drawable/loading_blue_16_f0" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f1" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f2" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f3" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f4" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f5" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f6" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f7" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f8" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f9" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f10" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f11" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f12" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f13" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f14" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f15" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f16" /><item android:duration="150" android:drawable="@drawable/loading_blue_16_f17" /></animation-list>在layout⽂件中引⽤如下:<ProgressBarandroid:id="@+id/progressBar1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginBottom="20dip"android:layout_marginTop="20dip"android:indeterminate="false"android:indeterminateDrawable="@anim/loading_anim" />⼆、通过⾃定义颜⾊实现定义res/drawable/loading_color.xml如下:<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="/apk/res/android"android:fromDegrees="0"android:pivotX="50%"android:pivotY="50%"android:toDegrees="360" ><shapeandroid:innerRadiusRatio="3"android:shape="ring"android:thicknessRatio="8"android:useLevel="false" ><gradientandroid:centerColor="#FFDC35"android:centerY="0.50"android:endColor="#CE0000"android:startColor="#FFFFFF"android:type="sweep"android:useLevel="false" /></shape></rotate>在layout⽂件中引⽤如下:<ProgressBarandroid:id="@+id/progressBar2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:indeterminate="false"android:indeterminateDrawable="@drawable/loading_color" />三、使⽤⼀张图⽚进⾏⾃定义定义res/drawable/loading_img.xml如下:<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android" ><item><rotateandroid:drawable="@drawable/exchange_loading"android:fromDegrees="0.0"android:pivotX="50.0%"android:pivotY="50.0%"android:toDegrees="360.0" /></item></layer-list>在layout⽂件中引⽤如下:<ProgressBarandroid:id="@+id/progressBar3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:indeterminate="false"android:indeterminateDrawable="@drawable/lodaing_img"/>以上内容是⼩编给⼤家分享的Android三种⽅式实现ProgressBar⾃定义圆形进度条,希望对⼤家有所帮助!。
自定义view的绘制流程
自定义view的绘制流程自定义View的绘制流程。
在Android开发中,自定义View是非常常见的需求,通过自定义View可以实现各种炫酷的效果,满足各种个性化的设计需求。
但是,自定义View的绘制流程并不是那么简单,需要我们对View的绘制机制有一定的了解,才能够高效地实现自定义View的绘制。
本文将从自定义View的基本概念开始,逐步介绍自定义View的绘制流程。
1. 自定义View的基本概念。
自定义View是指在Android开发中,通过继承View或者ViewGroup来创建自定义的UI控件。
通过自定义View,我们可以实现各种各样的UI效果,比如自定义的按钮样式、进度条样式、图表样式等。
自定义View的核心就是重写View或者ViewGroup的绘制方法,以实现我们所需的UI效果。
2. 自定义View的绘制流程。
自定义View的绘制流程可以分为以下几个步骤:(1)onMeasure,测量View的大小。
在onMeasure方法中,我们需要通过调用setMeasuredDimension方法来设置View的大小。
在这个方法中,我们需要考虑View的宽度和高度,以及View的测量模式。
通常情况下,我们需要根据View的内容和父容器的大小来计算View的大小,并根据测量模式来确定View的最终大小。
(2)onLayout,确定View的位置。
在onLayout方法中,我们需要通过调用layout方法来确定View在父容器中的位置。
在这个方法中,我们需要考虑View的左上右下四个位置,以及父容器的大小和布局方式,来确定View的最终位置。
(3)onDraw,绘制View的内容。
在onDraw方法中,我们需要通过Canvas来绘制View的内容。
在这个方法中,我们可以使用各种绘制方法来绘制文字、图形、图片等内容,以实现我们所需的UI效果。
在绘制过程中,我们还可以通过Paint来设置绘制的样式、颜色、字体等属性,以实现更加丰富的UI效果。
android linearprogressindicator 用法
android linearprogressindicator 用法`LinearProgressIndicator` 是Android 中的一个控件,它用于在用户等待某个任务完成时显示一个水平进度条。
在本文中,我将详细介绍`LinearProgressIndicator` 的用法,包括创建、设置样式、自定义和使用注意事项等方面的内容。
创建LinearProgressIndicator要创建一个`LinearProgressIndicator`,首先需要在布局文件中将其添加为一个控件。
可以使用以下代码将其添加到布局中:xml<com.google.android.material.progressindicator.LinearProgressIndicator android:id="@+id/linearProgressIndicator"android:layout_width="match_parent"android:layout_height="wrap_content"android:indeterminate="true"/>在这个示例中,`android:indeterminate="true"` 设置了进度条为不确定进度条,即进度条会不间断地动画,而不是显示具体的进度值。
如果你希望显示具体的进度值,可以将`android:indeterminate` 设置为`false`。
自定义样式`LinearProgressIndicator` 可以通过不同的样式属性来自定义外观。
以下是一些常用的样式属性:- `app:trackColor`:设置进度条的轨道颜色。
- `app:indicatorColor`:设置进度条的指示器颜色。
- `app:indicatorCornerRadius`:设置进度条指示器的圆角半径。
android实现音乐播放器进度条效果
android实现⾳乐播放器进度条效果本⽂实例为⼤家分享了android实现⾳乐播放器进度条效果的具体代码,供⼤家参考,具体内容如下效果图依赖3个对象MediaPlayer:实现⾳乐播放,暂停,缓冲。
SeekBar:滑动的进度条。
java.util.Timer:定时器,时时更新进度条。
main.xml样式⽂件<TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello" /><EditTextandroid:id="@+id/mediaFileName"android:layout_width="match_parent"android:text="gangstabop.mp3"android:layout_height="wrap_content" ><requestFocus /></EditText><LinearLayoutandroid:id="@+id/linearButton"android:layout_width="match_parent"android:layout_height="wrap_content" ><Buttonandroid:id="@+id/playButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/stop" /><SeekBarandroid:id="@+id/playSeekBar"android:layout_width="140px"android:layout_height="wrap_content"android:layout_marginLeft="3px"android:layout_marginTop="5px" />android:id="@+id/replayButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="3px"android:text="@string/replay" /></LinearLayout>Activity实现代码/*** @CreateDate 2015-2-3* @Author hubiao* @Title ⾳乐播放器*/public class MediaActivity extends Activity {private MediaPlayer mediaPlayer;//媒体播放器private Button playButton;private Button replayButton ;private boolean isCellPlay;/*在挂断电话的时候,⽤于判断是否为是来电时中断*/private boolean isSeekBarChanging;//互斥变量,防⽌进度条与定时器冲突。
[C#](原创)一步一步教你自定义控件——04,ProgressBar(进度条)
[C#](原创)⼀步⼀步教你⾃定义控件——04,ProgressBar(进度条)⼀、前⾔技术没有先进与落后,只有合适与不合适。
本篇的⾃定义控件是:进度条(ProgressBar)。
进度条的实现⽅式多种多样,主流的⽅式有:使⽤多张图⽚去实现、使⽤1个或2个Panel放到UserControl上去实现、重载系统进度条去实现等等。
本次所实现的进度条仍是使⽤GDI+去实现。
当然,如果只是实现最基本的扁平化的进度条,那完全不需要再写本篇⽂章,因为直接⼩改下第⼀篇的LTrackBar就⾏了。
既然写这篇⽂章,就是实现不⼀样的、⽐较好玩和好看的进度条,如环形进度条、饼形进度条等等。
本篇使⽤的知识都是前⼏篇中已经讲过的,并没有新的技术。
但是却附加了⼀些想像⼒,⼀些不拘⼀格、稍稍突破常规的想像⼒。
相信看完的你,⼀定会有所收获。
本⽂地址:⼆、前期分析(⼀)为什么需要⾃定义进度条?系统⾃带的滚动条样式太过单调,同时不够“扁平化”,所以便去实现⾃⼰的滚动条。
(⼆)实现⽬标1,⽀持三种样式(1)横条(Bar)(2)圆饼(Pie)(3)圆弧(Arc)2,⽀持显⽰和隐藏百分⽐(1)横条(Bar)(2)圆饼(Pie)(3)圆弧(Arc)3,⽀持多种进度形状(1)连续(2)分段块(3)两段式:先分段块再连续(4)螺旋(注:只有“横条”样式时才⽀持螺旋形状)4,⽀持Marquee样式当进度⽆法确定时,便需要使⽤Marquee样式,同系统进度条的“Marquee”样式类似。
不过⽀持更多的Marquee样式。
(1)左右摆动(2)循环穿过(3)往复(连续)(4)划过(连续)(5)往复(分段块)(6)划过(分段块)(7)螺旋5,⽀持调整进度条各元素尺⼨和颜⾊(1)设置边框厚度和颜⾊(2)设置背景⼤⼩和颜⾊(3)设置进度绘制位置和颜⾊(4)设置进度⽂本颜⾊(5)设置弧线厚度(仅样式为“圆弧(Arc)”时有效)(6)设置“分段块”厚度(仅进度条形状为“分段块”时有效)三、进度条拆解看了上⾯的实现⽬标,是不是感觉眼花缭乱、⽆从下⼿?下⾯我就对进度条进⾏拆分讲解,⼀步⼀步来看上⾯的效果是怎么实现的。
progressbar 用法
progressbar 用法
进度条(ProgressBar)是一种常用的用户界面元素,用于显示任务的执行进度。
它通常会显示一个填充的矩形,这个矩形的长度随着任务的进度而改变。
在 Android 应用中,我们可以通过 ProgressBar 控件来创建一个进度条。
以下是 ProgressBar 的几种用法:
1. 静态进度条:静态进度条是最简单的一种,它只显示一个固定的进度条,不能根据任务的进度进行动态更新。
2. 水平进度条:水平进度条通常用于显示任务的进度百分比。
它的长度会随着任务的进展而逐渐增长。
3. 循环进度条:循环进度条通常用于表示一个任务正在进行中,但是我们无法知道它何时才能结束。
这种进度条会不断地循环显示,直到任务完成。
4. 自定义进度条:如果以上的进度条无法满足我们的需求,我们可以使用自定义进度条。
自定义进度条可以根据我们的需要进行定制,比如可以添加动画效果、改变颜色等。
在使用 ProgressBar 控件时,我们需要注意以下几点:
1. 在任务执行期间,我们需要在主线程中更新进度条的进度。
2. 如果任务较为耗时,我们可以考虑使用异步任务(AsyncTask)来执行任务,并在 onPostExecute 方法中更新进度条的进度。
3. 在更新进度条进度时,我们需要确保进度条的最大值和当前
值都是合理的,否则会导致进度条无法正常显示。
总之,正确地使用 ProgressBar 可以提高应用的用户体验,使用户更好地了解任务的进度,从而提高用户对应用的信任度和满意度。
Android七种进度条的样式
Android七种进度条的样式当⼀个应⽤在后台执⾏时,前台界⾯就不会有什么信息,这时⽤户根本不知道程序是否在执⾏、执⾏进度如何、应⽤程序是否遇到错误终⽌等,这时需要使⽤进度条来提⽰⽤户后台程序执⾏的进度。
Android系统提供了两⼤类进度条样式,长形进度条(progress-BarStyleHorizontal)和圆形进度条(progressBarStyleLarge)。
进度条⽤处很多,⽐如,应⽤程序装载资源和⽹络连接时,可以提⽰⽤户稍等,这⼀类进度条只是代表应⽤程序中某⼀部分的执⾏情况,⽽整个应⽤程序执⾏情况呢,则可以通过应⽤程序标题栏来显⽰⼀个进度条,这就需要先对窗⼝的显⽰风格进⾏设置"requestWindowFeature(Window.FEATURE_PROGRESS)"。
先看下⾯效果图:例1:(默认样式(中等圆形))Xml代码<ProgressBarandroid:id="@+id/progressBar1"android:layout_width="wrap_content"android:layout_height="wrap_content"/>例2:(超⼤圆形)例1:(默认样式(中等圆形))Xml代码<ProgressBarandroid:id="@+id/progressBar1"android:layout_width="wrap_content"android:layout_height="wrap_content"/>例2:(超⼤圆形)Xml代码<ProgressBarandroid:id="@+id/progressBar2"android:layout_width="wrap_content"android:layout_height="wrap_content"style="?android:attr/progressBarStyleLarge"/>例3:(⼩号圆形)Xml代码<ProgressBarandroid:id="@+id/progressBar3"android:layout_width="wrap_content"android:layout_height="wrap_content"style="?android:attr/progressBarStyleSmall"/>例4:(标题⼩号圆形)Xml代码<ProgressBarandroid:id="@+id/progressBar4"android:layout_width="wrap_content"android:layout_height="wrap_content"style="?android:attr/progressBarStyleSmallTitle"/>例4-在标题中使⽤⼩号圆形的使⽤代码:Java代码@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置标题不确定性进度条风格requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(yout.progress_bars);//显⽰标题不确定性进度条setProgressBarIndeterminateVisibility(true);//关闭标题不确定性进度条//setProgressBarIndeterminateVisibility(false);}例5:(长⽅形进度条)Xml代码<ProgressBarandroid:id="@+id/progressBar5"android:layout_width="200dp"android:layout_height="wrap_content"style="?android:attr/progressBarStyleHorizontal"android:max="100"android:progress="50"android:secondaryProgress="70"/>android:max="100" 最⼤进度值100android:progress="50" 当前初始化进度值50android:secondaryProgress="70" 当前初始化第2进度值70例5-在标题中使⽤长⽅形进度条的代码:Java代码@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//设置标题进度条风格requestWindowFeature(Window.FEATURE_PROGRESS);setContentView(yout.progress_bars);//显⽰标题进度setProgressBarVisibility(true);//设置标题当前进度值为5000(标题进度最⼤值默认为10000)setProgress(5000);//关闭标题进度//setProgressBarVisibility(false);}例6:(进度对话框-圆形进度条)Java代码ProgressDialog dialog = new ProgressDialog(this);//设置进度条风格,风格为圆形,旋转的dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置ProgressDialog 标题dialog.setTitle("进度对话框");//设置ProgressDialog 提⽰信息dialog.setMessage("圆形进度条");//设置ProgressDialog 标题图标dialog.setIcon(android.R.drawable.ic_dialog_map);//设置ProgressDialog 的⼀个Buttondialog.setButton("确定", new ProgressDialog.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}});//设置ProgressDialog 的进度条是否不明确dialog.setIndeterminate(false);//设置ProgressDialog 是否可以按退回按键取消dialog.setCancelable(true);//显⽰dialog.show();例7:(进度对话框-长⽅形进度条)Java代码ProgressDialog dialog = new ProgressDialog(this);//设置进度条风格,风格为圆形,旋转的dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置ProgressDialog 标题dialog.setTitle("进度对话框");//设置ProgressDialog 提⽰信息dialog.setMessage("长⽅形进度条");//设置ProgressDialog 标题图标dialog.setIcon(android.R.drawable.ic_dialog_alert);//设置ProgressDialog的最⼤进度dialog.setMax(100);//设置ProgressDialog 的⼀个Buttondialog.setButton("确定", new ProgressDialog.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}});//设置ProgressDialog 是否可以按退回按键取消dialog.setCancelable(true);//显⽰dialog.show();//设置ProgressDialog的当前进度dialog.setProgress(50);通过本篇⽂章介绍了Android 七种进度条的样式,希望⼤家喜欢。
viewstub viewbinding用法
viewstub viewbinding用法ViewStub是Android提供的一个延迟加载布局的机制,可以将一部分布局延迟到使用时才加载,以提高性能和内存的使用效率。
而ViewBinding是Android官方推荐的一种用于获取View的技术,可以通过自动生成的绑定类直接获取布局文件中的各个视图,避免了使用findViewById()的繁琐操作。
ViewStub的用法如下:1.在布局文件中添加ViewStub标签,可以设置layout属性指定需要延迟加载的布局文件。
2.在代码中通过findViewById()获取到ViewStub对象。
3.当需要加载延迟布局时,调用ViewStub的inflate()方法,并通过返回的View对象进行操作。
ViewBinding的用法如下:1.在build.gradle文件中的android标签下添加viewBinding的开启。
2.在布局文件中使用<data>标签声明一个变量,在该变量中指定布局文件的根元素。
3.在代码中使用自动生成的绑定类引用布局文件,并获取到布局中的各个View。
ViewBinding相对于传统的findViewById()的优势在于:1.自动生成的绑定类避免了手动findViewById()的过程,提高了开发效率。
2.绑定类是类型安全的,编译时会对类型进行检查,减少了运行时的Null Pointer异常。
3. ViewBinding不需要添加额外的依赖库,仅需要在build.gradle文件中添加配置即可使用。
需要注意的是,ViewStub和ViewBinding是两个独立的技术,但可以结合使用。
当需要加载ViewStub中的延迟布局时,可以使用ViewBinding来操作该布局中的视图,以方便地对视图进行操作。
这样既可以享受延迟加载布局带来的性能优势,又能利用ViewBinding简化对视图的操作代码。
android自定义进度条
android⾃定义进度条⾃定义view,显⽰进度标点及进度数值,外进度框和内进度条。
⾃定义view类package com.sample.util;import android.annotation.SuppressLint;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.util.Log;import android.view.View;import com.gj.gateway.R;public class HProgressBar extends View {private final String TAG = "HProgressBar";private int mProgress_outline_color = 0xFFFFFFFF;//外边框颜⾊private int mProgress_color = 0xFFFFFFFF; //进度条颜⾊private int mProgress_circle_color = 0xFFD1F4DE; //圆圈颜⾊private int mProgress_text_color = 0xFFFFFFFF; //进度字体颜⾊private int mProgress_text_bg_color = 0x50FFFFFF; //进度背景颜⾊private float mProgress_circle_height = 56;// 56; //圆圈⾼度private float mProgress_height = 40;// 25; //progress⾼度private float mProgress_bar_height = 30; //progress进度条⾼度private float mProgress_text_height = 35; //进度⽂字⾼度private float mProgress_text_paddingH = 25; //进度⽂字左右paddingprivate float mProgress_text_paddingV = 0; //进度⽂字上下padingprivate float mProgress_text_size = 32; //进度⽂字字体⼤⼩private float mMaxProgress = 100;private volatile float mProgress_progress_bar = 0;private int mProgressWidth;private Paint mOutLinePaint;private Paint mProgressPaint;private Paint mCirClePaint;private Paint mTextPain;private Paint mTextBgPain;public HProgressBar(Context context) {super(context);Log.d(TAG, "HProgressBar: 1");}public HProgressBar(Context context, AttributeSet attrs) {super(context, attrs);Log.d(TAG, "HProgressBar: 2");initDefStyleAttr(attrs);mOutLinePaint = new Paint();mOutLinePaint.setColor(mProgress_outline_color);mOutLinePaint.setAntiAlias(true);mOutLinePaint.setStrokeWidth(2);mOutLinePaint.setStyle(Paint.Style.STROKE); //设置空⼼mProgressPaint = new Paint();mProgressPaint.setColor(mProgress_color);mProgressPaint.setAntiAlias(true);mCirClePaint = new Paint();mCirClePaint.setColor(mProgress_circle_color);mCirClePaint.setAntiAlias(true);mTextBgPain = new Paint();mTextBgPain.setColor(mProgress_text_bg_color);mTextBgPain.setAntiAlias(true);mTextPain = new Paint();mTextPain.setColor(mProgress_text_color);mTextPain.setAntiAlias(true);mTextPain.setTextSize(mProgress_text_size);mTextPain.setTextAlign(Paint.Align.CENTER);mTextPain.setTextSize(mProgress_text_size);}public HProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);Log.d(TAG, "HProgressBar: 3");}public HProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);Log.d(TAG, "HProgressBar: 4");}private void initDefStyleAttr(AttributeSet attrs) {final TypedArray attributes = getContext().obtainStyledAttributes(attrs, R.styleable.HProgress);mProgress_outline_color = attributes.getColor(R.styleable.HProgress_hProgress_outline_color, mProgress_outline_color);mProgress_color = attributes.getColor(R.styleable.HProgress_hProgress_color, mProgress_color);mProgress_circle_color = attributes.getColor(R.styleable.HProgress_hProgress_circle_color, mProgress_circle_color);mProgress_text_color = attributes.getColor(R.styleable.HProgress_hProgress_text_color, mProgress_text_color);mProgress_text_bg_color = attributes.getColor(R.styleable.HProgress_hProgress_text_bg_color, mProgress_text_bg_color);mProgress_circle_height = (int) attributes.getDimension(R.styleable.HProgress_hProgress_circle_height, mProgress_circle_height);mProgress_height = (int) attributes.getDimension(R.styleable.HProgress_hProgress_height, mProgress_height);mProgress_bar_height = (int) attributes.getDimension(R.styleable.HProgress_hProgress_bar_height, mProgress_bar_height);mProgress_text_height = (int) attributes.getDimension(R.styleable.HProgress_hProgress_text_height, mProgress_text_height);mProgress_text_size = (int) attributes.getDimension(R.styleable.HProgress_hProgress_text_size, mProgress_text_size);mProgress_text_paddingH = (int) attributes.getDimension(R.styleable.HProgress_hProgress_text_paddingH, mProgress_text_paddingH); mProgress_text_paddingV = (int) attributes.getDimension(R.styleable.HProgress_hProgress_text_paddingV, mProgress_text_paddingV); mProgress_progress_bar = attributes.getInteger(R.styleable.HProgress_hProgress_progress_bar, (int)mProgress_progress_bar);mMaxProgress = attributes.getInteger(R.styleable.HProgress_hProgress_maxProgress, (int) mMaxProgress);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mProgressWidth = MeasureSpec.getSize(widthMeasureSpec);setMeasuredDimension(mProgressWidth, (int )(mProgress_text_height + mProgress_circle_height));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Rect rect = new Rect();mTextPain.getTextBounds(String.valueOf(getProgress()), 0, String.valueOf(getProgress()) .length(),rect);int w = rect.width();int h = rect.height();float spaceA = (mProgress_circle_height - mProgress_height) / 2;float spaceB = (mProgress_height - mProgress_bar_height) / 2;float progressMargin = mProgress_circle_height / 2;//长度变化范围等于控件长度减去两边的边距和空隙,由于是圆⾓进度条,还要减去内进度条的⾼度,即内进度条两边半圆的长度float changeRange = mProgressWidth - (progressMargin + spaceB) * 2 - mProgress_bar_height;float startPoint = progressMargin + spaceB;float circleX = startPoint + mProgress_bar_height / 2 + changeRange * getProgress() / mMaxProgress;float textStartX;float textEndX;if (circleX - w / 2 - mProgress_text_paddingH < 0) {textStartX = 0;textEndX = textStartX + w + mProgress_text_paddingH * 2;} else if (circleX + w / 2 + mProgress_text_paddingH >= mProgressWidth) {textStartX = mProgressWidth - mProgress_text_paddingH * 2 - w;textEndX = mProgressWidth;} else {textStartX = circleX - w / 2 - mProgress_text_paddingH;textEndX = circleX + w / 2 + mProgress_text_paddingH;}//画数字背景框RectF rectF2 = new RectF(textStartX,mProgress_circle_height,textEndX,mProgress_circle_height + mProgress_text_height);canvas.drawRoundRect(rectF2, mProgress_text_height / 2, mProgress_text_height / 2, mTextBgPain);//画数字进度Paint.FontMetrics fontMetrics = mTextPain.getFontMetrics();canvas.drawText((int)getProgress() + "",(textStartX + textEndX) / 2,mProgress_circle_height + mProgress_text_height / 2 + (fontMetrics.descent - fontMetrics.ascent) / 2 - fontMetrics.descent, mTextPain);//画progressBar 外边RectF rectF = new RectF(progressMargin, spaceA,mProgressWidth - progressMargin, mProgress_height + spaceA);canvas.drawRoundRect(rectF, mProgress_height / 2, mProgress_height / 2, mOutLinePaint);//画progressBar 内进度条RectF rectF1 = new RectF(startPoint,spaceA + spaceB,startPoint + mProgress_bar_height + changeRange * getProgress()/mMaxProgress,mProgress_bar_height + spaceB + spaceA);canvas.drawRoundRect(rectF1, mProgress_bar_height / 2, mProgress_bar_height / 2, mProgressPaint);//画圆canvas.drawCircle(circleX,mProgress_circle_height / 2,mProgress_circle_height / 2, mCirClePaint);}public int getProgress() {return (int)mProgress_progress_bar;}public void setProgress(int progress) {if (progress > mMaxProgress) {throw new RuntimeException("progress mast less than mMaxProgress");}mProgress_progress_bar = progress;postInvalidate();}public void setmMaxProgress(int maxProgress) {this.mMaxProgress = maxProgress;}}资源⽂件中attrs.xml对应定义<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="HBLevelView"><attr name="startProgress" format="float|reference" /><attr name="scurrProgress" format="float|reference" /><attr name="endProgress" format="float|reference" /><attr name="progressTextSize" format="reference|dimension" /><attr name="backColor" format="color|reference" /><attr name="foreColor" format="color|reference" /><attr name="textColor" format="color|reference" /><attr name="rectCorn" format="dimension|reference" /></declare-styleable><declare-styleable name="HProgress"><!--外边框颜⾊--><attr name="hProgress_outline_color" format="color" /><!--进度条颜⾊--><attr name="hProgress_color" format="color" /><!--圆圈颜⾊--><attr name="hProgress_circle_color" format="color" /><!--进度字体颜⾊--><attr name="hProgress_text_color" format="color" /><!--进度背景颜⾊--><attr name="hProgress_text_bg_color" format="color" /><!--圆圈⾼度--><attr name="hProgress_circle_height" format="dimension" /><!--progress⾼度--><attr name="hProgress_height" format="dimension" /><!--progress进度条⾼度--><attr name="hProgress_bar_height" format="dimension" /><!--进度⽂字⾼度--><attr name="hProgress_text_height" format="dimension" /><!--进度⽂字字体⼤⼩--><attr name="hProgress_text_size" format="dimension" /><!--进度⽂字横向padding--><attr name="hProgress_text_paddingH" format="dimension" /><!--进度⽂字纵向padding--><attr name="hProgress_text_paddingV" format="dimension" /><!--进度值--><attr name="hProgress_progress_bar" format="integer" /><attr name="hProgress_maxProgress" format="integer" /></declare-styleable></resources>如果想使⽤该进度条,可以将这两个⽂件移⼊到⼯程⽬录中,在布局⽂件中使⽤⾃定义类: <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal"> <com.sample.util.HProgressBar android:id="@+id/hprogress_bar_register" android:layout_width="@dimen/d_885dp" android:layout_height="@dimen/d_40dp" android:layout_marginTop="@dimen/d_100dp"/></LinearLayout>操作控件private HProgressBar mHProgressBar;....mHProgressBar = (HProgressBar)findViewById(R.id.hprogress_bar_register);....mHProgressBar.setProgress(100);。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android 自定义View——动态进度条这个是看了梁肖的demo,根据他的思路自己写了一个,但是我写的这个貌似计算还是有些问题,从上面的图就可以看出来,左侧、顶部、右侧的线会有被截掉的部分,有懂得希望能给说一下,改进一下,这个过程还是有点曲折的,不过还是觉得收获挺多的。
比如通动画来进行动态的展示(之前做的都是通过Handler进行更新的所以现在换一种思路觉得特别好),还有圆弧的起止角度,矩形区域的计算等!关于绘制我们可以循序渐进,比如最开始先画圆,然后再画周围的线,最后设置动画部分就可以了。
不多说了,上代码了。
代码自定义Viewpublic class ColorProgressBar extends View{//下面这两行在本demo中没什么用,只是前几天看别人的代码时学到的按一定尺寸,设置其他尺寸的方式,自动忽略或者学习一下也不错// private int defaultStepIndicatorNum= (int) TypedValue.applyDimension(PLEX_UNIT_DIP,40,getResources().getDisplay Metrics());// int mCircleRadius=0.28f*defaultStepIndicatorNum;//布局的宽高private int mWidth;private int mHeight;//直径private int mDiameter=500;//底层圆画笔private Paint mPaintbg;//顶层圆的画笔private Paint mPaintft;//周围线的画笔private Paint mPaintLine;//外层线条的长度private int mLongItem=dip2px(20);//线条与圆的间距private int mDistanceItem=dip2px(10);//进度条的最大宽度(取底层进度条与顶层进度条宽度最大的)private int mProgressWidth;//底层圆的颜色private int mBackColor;//顶层圆的颜色private int mFrontColor;//底层圆、顶层圆的宽度private float mBackWidth;private float mFrontWidth;//设置进度private float currentvalue;//通过动画演示进度private ValueAnimator animator;private int curvalue;public ColorProgressBar(Context context) {this(context,null,0);}public ColorProgressBar(Context context, AttributeSet attrs) {this(context, attrs,0);}public ColorProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr);TypedArray ta=context.obtainStyledAttributes(attrs, R.styleable.ColorProgressBar);mBackColor= ta.getColor(R.styleable.ColorProgressBar_back_color, Color.BLACK);mFrontColor=ta.getColor(R.styleable.ColorProgressBar_front_color,mBackColor);mBackWidth=ta.getDimension(R.styleable.ColorProgressBar_back_width,dip2px(10));mFrontWidth=ta.getDimension(R.styleable.ColorProgressBar_front_width,dip2px(10));mProgressWidth=mBackWidth>mFrontWidth?(int)mBackWidth:(int)mFrontWidth;//注意释放资源ta.recycle();init();}/*** 都是画笔初始化*/private void init() {mPaintbg=new Paint(Paint.ANTI_ALIAS_FLAG);mPaintbg.setStrokeWidth(mProgressWidth);mPaintbg.setColor(mBackColor);mPaintbg.setStrokeCap(Paint.Cap.ROUND);mPaintbg.setStyle(Paint.Style.STROKE);mPaintft=new Paint(Paint.ANTI_ALIAS_FLAG);mPaintft.setColor(mFrontColor);mPaintft.setStyle(Paint.Style.STROKE);mPaintft.setStrokeWidth(mFrontWidth);mPaintft.setStrokeCap(Paint.Cap.ROUND);mPaintLine=new Paint(Paint.ANTI_ALIAS_FLAG);mPaintLine.setColor(Color.BLACK);mPaintLine.setStrokeWidth(5);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// 宽度=高度=(长指针+指针与圆盘的间距+进度条的粗细+半径)*2Log.e("测量数据","LongItem:"+mLongItem+"mDistanceItem:"+mDistanceItem+"mProgressWidth:"+mProgressWidth+"mDia meter:"+mDiameter/2);mWidth=(int)2*(mLongItem+mDistanceItem+mProgressWidth*2+mDiameter/2);mHeight=(int)2*(mLongItem+mDistanceItem+mProgressWidth*2+mDiameter/2);Log.e("自定义View","高度"+mHeight+"宽度"+mWidth);setMeasuredDimension(mWidth,mHeight);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//绘制底层圆弧,矩形的具体计算见图片canvas.drawArc(newRectF(mProgressWidth/2+mDistanceItem+mLongItem,mProgressWidth/2+mDistanceItem+mLon gItem,mWidth-mProgressWidth/2-mDistanceItem-mLongItem,mHeight-mProgressWidth/2-mDist anceItem-mLongItem),0,360,true,mPaintbg);// SweepGradient gradient=new SweepGradient();//绘制边缘线canvas.save();canvas.rotate(144,mWidth/2,mHeight/2);for(int i=0;i<=30;i++){canvas.rotate(-9,mWidth/2,mHeight/2);if(i%5==0){canvas.drawLine(mWidth/2,5,mWidth/2,mLongItem,mPaintbg);}else {canvas.drawLine(mWidth/2,25,mWidth/2,mLongItem,mPaintLine);}}canvas.restore();//给画笔设置渐变SweepGradient sweepGradient=new SweepGradient(mWidth/2,mHeight/2,Color.RED,Color.YELLOW);mPaintft.setShader(sweepGradient);//绘制顶层圆弧,currentvalue在改变时呈现动态效果canvas.drawArc(newRectF(mProgressWidth/2+mDistanceItem+mLongItem,mProgressWidth/2+mDistanceItem+mLon gItem,gressWidth/2-mDistanceItem-mLongItem,mHeight-mProgr essWidth/2-mDistanceItem-mLongItem),135,currentvalue,false,mPaintft);mPaintft.setTextSize(100);mPaintft.setTextAlign(Paint.Align.CENTER);//绘制文本canvas.drawText(String.format("%.0f",currentvalue),mWidth/2,mHeight/2+50,mPaintft);invalidate();}/*** 设置动画* @param value*/public void setCurrentValue(float value){// currentvalue=value;animator=ValueAnimator.ofFloat(currentvalue,value);animator.setDuration(3000);animator.setTarget(currentvalue);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {currentvalue= (float) valueAnimator.getAnimatedValue();curvalue=curvalue/10;}});animator.start();}private int dip2px(float dip){float density=getContext().getResources().getDisplayMetrics().density;return (int)(dip*density+0.5f);}}Activity调用@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.colorprogressbar);mBtStart1= (ton) findViewById(R.id.bt1);bar1= (ColorProgressBar) findViewById(R.id.cp1);mBtStart1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {bar1.setCurrentValue(270);}});}自定义属性<declare-styleable name="ColorProgressBar"><attr name="back_color" format="color"></attr><attr name="front_color" format="color"></attr><attr name="back_width" format="dimension"></attr><attr name="front_width" format="dimension"></attr></declare-styleable>布局注意:为了使用自定义属性需要添加一行代码(AS)布局<LinearLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:id="@+id/bt1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="start1"/><workdemo.colorprogressbar.widget.ColorProgressBar android:id="@+id/cp1"android:layout_width="232dp"android:layout_height="match_parent"android:layout_gravity="center_horizontal"app:back_color="@color/colorPrimary"app:front_color="@color/colorAccent"android:background="@mipmap/ic_launcher"/> </LinearLayout>。