Android实现带箭头的自定义Progressbar

一、闲话:

Android原生的进度条可以根据不同的主题有不同的视觉效果,但任何一种主题下的进度条和应用程序的视觉配合起来都显得格格不入,所以多数时候我们需要自定义Progressbar,最简单的是在布局文件中通过“android:progressDrawable”为Progressbar换背景和进度图片,换图后的效果类似于这样:

但你会发现,进度图片像是被截断了一样,看上去同样不美观,所以现在很多应用都会在进度条上玩花样,做出各种各样的效果,本例介绍的是在进度条的头部加上光晕箭头的效果,最终效果类似于这样,知道如何做这个效果和,其它效果(一个动画带着进度条跑、火箭进度条等)自然而然也就会了:

二、实现原理:

实现上述自定义的Progressbar需要做两件事情:

1、给ProgressBar换前景和背景图,这个在布局文件中定义Progressbar的时候直接设置其progressDrawableJ就可以了,eg:

<ProgressBar
        android:id="@+id/downloadProgressId"
	style="?android:attr/progressBarStyleHorizontal"
	android:layout_width="893.0dp"
	android:layout_height="14.0dp"
	android:layout_centerInParent="true"
	android:progressDrawable="@drawable/arrow_progress_bg"
	android:max="100"
	android:progress="0"
	/>

arrow_progress_bg.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 背景 -->
    <item
        android:id="@android:id/background"
        android:drawable="@drawable/arrow_progress_bar_bottom_layer"
        />
    <!-- 进度 -->
    <item
        android:id="@android:id/progress"
        android:drawable="@drawable/arrow_progress_bar_top_layer"
        />
</layer-list>

2、给进度加上光晕箭头效果,本例是通过在布局文件中定义一个ImageView,在Progressbar进度改变时,通过LayoutParams时动态改变ImageView的位置。

三、核心代码:

我将上述效果封装在一个类,形成一个自定义的Progressbar,如下:

public class ArrowProgressBar extends RelativeLayout {
	public ArrowProgressBar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initArrowProgressBar( context );
	}

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

	public ArrowProgressBar(Context context) {
		super(context);
		initArrowProgressBar( context );
	}

	private void initArrowProgressBar( Context context ){
		LayoutInflater layoutInflater = LayoutInflater.from( context );
		View view = layoutInflater.inflate(R.layout.arrow_progress_bar_layout, null);

		mProgressBar = ( ProgressBar )view.findViewById( R.id.downloadProgressId );
		mProgressTxt = ( TextView )view.findViewById( R.id.progressTxtId );
		mArrowImg = ( ImageView )view.findViewById( R.id.arrowImgId );
		mArrowImg.setVisibility( ImageView.GONE );

		addView( view );
	}

	public void setProgress( int progress ){
		if( progress < PROGRESS_MAX ){
			LayoutParams arrowParams = ( LayoutParams )mArrowImg.getLayoutParams( );
			float leftPosition = ( ( mProgressBar.getWidth( )/PROGRESS_MAX ) * ( progress - 2 ) ) + mProgressBar.getLeft();
			arrowParams.leftMargin = ( int )Math.ceil( leftPosition );

			mArrowImg.setLayoutParams( arrowParams );
		}else{
			mArrowImg.setVisibility( ImageView.GONE );
		}

		mProgressBar.setProgress( progress );
		mProgressTxt.setText( progress + "%" );
	}

	private ProgressBar mProgressBar = null;
	private TextView mProgressTxt = null;
	private ImageView mArrowImg = null;
	private static final float PROGRESS_MAX = 100.0f;
}

arrow_progress_bar_layout.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <RelativeLayout
        android:id="@+id/progressLayoutId"
        android:layout_width="fill_parent"
        android:layout_height="43.0dp"
        android:layout_centerHorizontal="true">
        <ProgressBar
	        android:id="@+id/downloadProgressId"
	        style="?android:attr/progressBarStyleHorizontal"
	        android:layout_width="893.0dp"
	        android:layout_height="14.0dp"
	        android:layout_centerInParent="true"
	        android:progressDrawable="@drawable/arrow_progress_bg"
	        android:max="100"
	        android:progress="0"
	        />
	    <ImageView
	        android:id="@+id/arrowImgId"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:background="@drawable/arrow_progress_bar_arrow"
	        android:contentDescription="@string/app_name"
	        />
    </RelativeLayout>
    <TextView
        android:id="@+id/progressTxtId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:layout_below="@id/progressLayoutId"
        android:layout_marginTop="10.0dp"
        android:background="@drawable/arrow_progress_text_background"
        android:textColor="@android:color/white"
        android:textSize="30.0dp"
        />
</RelativeLayout>

四、Demo程序:

Android自定义带箭头的ProgressBar

时间: 2024-10-07 23:05:32

Android实现带箭头的自定义Progressbar的相关文章

Android自定义ViewGroup(一)——带箭头的圆角矩形菜单

今天要做一个带箭头的圆角矩形菜单,大概长下面这个样子: 要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置. 最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太low了点,而且不同分辨率也不太好适配,干脆自定义一个ViewGroup吧! 自定义ViewGroup其实很简单,基本都是按一定的套路来的. 一.定义一个attrs.xml 就是声明一下你的这个自定义View有哪些可配置的属性,将来使用的时候可以自由配置.这里声明了7个属性,分别是:箭头宽度.箭头

Android下如何自定义ProgressBar的外观

在Android应用中经常会用的到一些进度条,这些进度条的样子千差万别,但是大多都是由ProgressBar来的.但是Android系统自带的进度条样式却不太好看,今天要做的就是自定义一个好看的ProgressBar. 我们先来看看Android自带的进度条的样子: 我们今天的目标,自定义 的进度条的样子: 不难发现差距还是挺大的,好了,废话不多说,进入正题: 我们首先还是从源码入手,我们可以打开ADT目录下的sdk\platforms\android-16\data\res\values文件夹

Android之自定义ProgressBar

本文简单介绍下Android之自定义ProgressBar. 多的不说,先上图   布局文件 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" a

android 自定义progressbar 样式

在res下创建drawable文件夹,新建文件drawable/progressbar_color.xml <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 背景 gradient是

Android三种实现自定义ProgressBar的方式介绍

一.通过动画实现 定义res/anim/loading.xml如下: View Row Code<?xml version="1.0" encoding="UTF-8"?><animation-list android:oneshot="false"xmlns:android="http://schemas.android.com/apk/res/android"><item android:du

Android 两种自定义ProgressBar

横向的ProgressBar 在res下创建drawable文件夹,新建文件drawable/progressbar_color.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 背景 gradient是渐变,corners定义

强烈推荐:Android史上最强大的自定义任务软件Tasker

强烈推荐:Android史上最强大的自定义任务软件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出处: 木蚂蚁手机乐园) Android上的Tasker绝对称得上是Android系统的神器之一,与Auto Memory Manager不同,Tasker不是加速型的软件,而是系统增强型的软件,由于有众多系统状态可控制,故使得Tasker一跃成为Android系统中最闪亮的明星.但Tasker也无疑是最难使用的软件,由于可以控制的地方太多,反而让

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

Android 中带你开发一款自动爆破签名校验工具 kstools

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Android中带你开发一款自动爆破签名校验工具kstools - 生死看淡,不服就干! - 博客频道 - CSDN.NET 生死看淡,不服就干! http://www.wjdiankong.cn 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &n