`

自定义条形进度条StripProgressBar

 
阅读更多

像游戏一样的进度条很常用到,我们简单制作如下:

 

(1)自定义控件:

package com.yiduoyun.tiku.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.yiduoyun.tiku.R;
import com.yiduoyun.tiku.util.CLog;


/**
 * 条形进度条
 * @author chenwenbiao
 * @date 2014-4-14 上午10:40:34
 * @version V1.0
 */
public class StripProgressBar extends FrameLayout{
	
	private String TAG = getClass().getName();

	private LinearLayout p1;
	private LinearLayout p2;
	private TextView textView;
	
	
	private float progressBarWidth = 0;//进度条的宽,使用这个宽来计算进度的
	private String progressBarTips = null;//进度条上显示的字
	
	private Context context = null;
	
	public StripProgressBar(Context context) {
		this(context , null , 0);
	}

	public StripProgressBar(Context context, AttributeSet attrs) {
		this(context , attrs , 0);
	}
	
	public StripProgressBar(Context context, AttributeSet attrs, int defStyle) {
		super(context , attrs, defStyle);
		this.context = context;

//		inflate(context, R.layout.strip_progress_barl, null);
		LayoutInflater.from(context).inflate(R.layout.strip_progress_bar,this,true);
		
//		TypedArray mTypedArray = context.obtainStyledAttributes(attrs,
//				R.styleable.StripProgressBar);
//		
		//获取自定义属性和默认值
//		progressBarWidth = mTypedArray.getDimension(R.styleable.StripProgressBar_progressBarWidth, 200);
//		CLog.d(TAG , "====== StripProgressBar     progressBarWidth======>" + progressBarWidth);
//		progressBarHeight = mTypedArray.getDimension(R.styleable.StripProgressBar_progressBarHeight, 40);
//		progressBarTips = mTypedArray.getString(R.styleable.StripProgressBar_progressTips);
//		mTypedArray.recycle();
		
		
//		rootLayout = (RelativeLayout)findViewById(R.id.progress_bar1_root_layout);
		
		p1 = (LinearLayout)findViewById(R.id.strip_progress_bar1_layout);
	    p2 = (LinearLayout)findViewById(R.id.strip_progress_bar2_layout);
	    textView = (TextView)findViewById(R.id.strip_progress_text_tv);
	    textView.setText(progressBarTips);
	    
	    
	}
	
	@Override
	public void onLayout(boolean changed, int left, int top, int right, int bottom){
	
		super.onLayout(changed, left, top, right, bottom);
		progressBarWidth = p1.getWidth();
		CLog.d(TAG , "====== onLayout     progressBarWidth======>" + progressBarWidth);
	}

	
	@Override
	public void onWindowFocusChanged(boolean hasWindowFocus) {
		super.onWindowFocusChanged(hasWindowFocus);
		progressBarWidth = p1.getWidth();
		CLog.d(TAG , "====== onWindowFocusChanged     progressBarWidth======>" + progressBarWidth);
	}
	
	
	/**
	 * 进度,从一到100数字来表示
	 * @param progress
	 */
	public void setProgress(int progress){
		p2.setVisibility(View.VISIBLE);
		int w = (int) (progressBarWidth*progress/100.0);
		CLog.d(TAG , "======W=========>" + w);
		
		/**
		 * 宽度太小,显示的圆弧就不成圆弧,所以这里搞一个最小值给它
		 */
		CLog.d(TAG , "progress radius ==========> " + context.getResources().getDimension(R.dimen.progress_radius));
		int min = (int) (context.getResources().getDimension(R.dimen.progress_radius) * 2);
		CLog.d(TAG , "min ==========> " + min);
		if( w < min / 2  ){//太小就不显示
			w = 0;
		}
		else if(w < min) {//小于一半,不到一个最小长度,就设置成最小长度
			w = min;
		}
		
	    android.widget.RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams)p2.getLayoutParams(); 
	    params.width = w;
	    p2.setLayoutParams(params);
	}
	
	/**
	 * 设置进度条显示的数字
	 * @param text
	 */
	public void setText(String text){
		textView.setText(text);
	}
}

 

 

(2)布局文件strip_progress_bar.xml:

<?xml version="1.0" encoding="utf-8"?>

<!-- 条形进度条 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/progress_bar1_root_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:background="#00000000" >

    <LinearLayout
        android:id="@+id/strip_progress_bar1_layout"
        android:layout_width="fill_parent"
        android:layout_height="20dp"
        android:background="@drawable/shape_progress_bar_1"
        android:orientation="horizontal" />

    <LinearLayout
        android:id="@+id/strip_progress_bar2_layout"
        android:layout_width="fill_parent"
        android:layout_height="20dp"
        android:background="@drawable/shape_progress_bar_2"
        android:orientation="horizontal"
        android:visibility="invisible" />

    <TextView
        android:id="@+id/strip_progress_text_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Level:3"
        android:textColor="#fff"
        android:textSize="12sp"
        android:textStyle="bold" />

</RelativeLayout>

 

 

 

3 进度条背景shape_progress_bar_1.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
            <!-- 圆角 -->

            <corners android:radius="@dimen/progress_radius" />

            <!-- 填充 -->

            <solid android:color="#ff098A82" />

            <!-- 描边 -->

            <stroke
                android:width="2dp"
                android:color="#ff06674B" />
</shape>

 

 

 

4 进度条背景shape_progress_bar_2.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    
            <!-- 圆角 -->

            <corners android:radius="@dimen/progress_radius" />

            <!-- 填充 -->

<!--             <solid android:color="#ffff9072" /> -->

      		<!-- 渐变 -->
            <gradient
                android:startColor="#ffffcbbd"
                android:centerColor="#ffff653b"
                android:endColor="#ffffcbbd"
                android:angle="270" />

            <!-- 描边 -->

            <stroke
                android:width="3dp"
                android:color="#008E8678" />
    
</shape>

  

5.dimens.xml

<resources>
    
    <dimen name="progress_radius">10dp</dimen>
    
</resources>

 

 

6使用很简单:

<com.yiduoyun.tiku.view.StripProgressBar
                            android:id="@+id/pb_exp"
                            android:layout_width="100dp"
                            android:layout_height="18dp" />

 

StripProgressBar pb_exp = (StripProgressBar) findViewById(R.id.pb_exp);
pb_exp.setText("Level: " + level);												//设置经验条中的等级信息
		pb_exp.setProgress(PetExpAndLevelCount.getPercentFromExp(experience, level));	//设置当前进度

 

效果图如下:

 

  • 大小: 3.3 KB
分享到:
评论

相关推荐

    安卓进度条loadingprogress相关-用canvas自定义弧形进度条以及可滑动的带状态值条形进度条并实现进度动画.rar

    本资源"安卓进度条loadingprogress相关-用canvas自定义弧形进度条以及可滑动的带状态值条形进度条并实现进度动画.rar"提供了两种自定义进度条的实现方式:弧形进度条和可滑动的带状态值条形进度条,并且都包含了进度...

    GTProgressBar, 在 Swift 4中,编写了可以自定义的进度条.zip

    GTProgressBar, 在 Swift 4中,编写了可以自定义的进度条 GTProgressBar GTProgressBar是可以自定义的进度条。 它支持垂直和水平方向,你可以调整进度条的许多可视设置以适应你的使用情况。 定制可以在接口构建器和...

    自定义进度条&自定义弧形进度条(附带动画效果)

    总结一下,自定义进度条和弧形进度条是提高应用程序用户体验的有效手段。通过HTML5的Canvas API,我们可以灵活地创建这些控件,并添加动态的动画效果。实现过程包括计算弧度、绘制形状、监听用户输入以及利用`...

    Android自定义的两种进度条--(圆形和条形)

    本文将详细介绍如何创建两种自定义进度条:圆形进度条和条形进度条。这两种进度条的实现方式各有特点,能够满足不同场景下的显示需求。 首先,我们来看圆形进度条。这种进度条通常用于表示某个任务的整体完成程度,...

    android实现自定义条形图

    在Android开发中,自定义条形图是一种常见的需求,它能直观地展示各种统计数据,使得用户更容易理解数据的分布和趋势。本篇文章将详细介绍如何在Android应用中实现自定义条形图,包括重写View、动态加载数据以及显示...

    C#winform条形方格进度条,横竖进度条

    在创建自定义进度条控件时,我们需要继承自`System.Windows.Forms.Control`类,并重写`OnPaint`方法。在这个方法中,我们将使用`Graphics`对象进行绘制工作。例如,我们可以使用`DrawRectangle`绘制进度条的背景,`...

    WPF自定义圆形进度条

    标题“WPF自定义圆形进度条”指出,我们要讨论的是如何在WPF应用中构建一个非传统的进度条,即不是通常的水平条形,而是一个圆形的展示方式。这样的设计通常更吸引眼球,且可以更直观地表示进度的循环性质,比如在...

    Android 绘制带数字进度条形进度条.zip

    本教程将探讨如何在Android中绘制一个带有数字显示的条形进度条。这个进度条不仅具有视觉吸引力,而且具有高度的可控性,可以按照开发者的需求进行定制。 首先,我们需要创建一个新的自定义View类,继承自Android的...

    ProgressBar自定义进度条

    水平进度条显示一个从左到右填充的条形,而旋转指示器则显示一个不断旋转的图标,通常用于表示未知的等待时间。 1. 添加到布局文件 在XML布局文件中,可以通过以下方式添加水平进度条: ```xml android:id="@+id/...

    IOS 开发自定义条形ProgressView的实例

    首先,创建自定义进度条的关键步骤是继承UIView来建立一个新的视图类,例如`CustomBarProgressView`。这样做是因为UIView是所有UI元素的基础,通过继承它可以添加自定义的行为和属性。 在`.H`(头文件)中,我们...

    WPF实现的圆形进度条

    圆形进度条通常用于展示一个任务的进度,它以直观的方式呈现百分比完成状态,与传统的水平条形进度条相比,更具有视觉吸引力。在本案例中,我们将探讨如何使用C#语言和XAML(WPF的标记语言)来实现一个类似安卓系统...

    自定义圆形进度条

    "自定义圆形进度条"就是这样一个实例,它允许我们展示数据进度或状态,通常以环形或圆形的方式,直观地传达出百分比信息。这个项目可能包含一个名为`CircleProgressDemo`的示例应用程序,用于演示如何实现这种效果。...

    VB自定义进度条

    在“VB自定义进度条”这个资源中,可能包含的是一个实现上述特性的自定义控件源代码,通过解压文件名列表中的"codefans.net",你将能够获取到完整的代码实现和可能的示例工程,进一步学习和应用这些自定义进度条的...

    自定义进度条demo

    系统自带的ProgressBar提供了一套基本的样式和行为,但有时为了满足个性化需求,开发者可能需要自定义进度条。本Demo就是针对这种情况,展示了如何在Android应用中实现自定义的进度条。 首先,我们要理解系统自带的...

    安卓进度条loadingprogress相关-自定义进度条效果.rar

    在Android开发中,自定义进度条(loadingprogress)是一个常见的需求,它可以帮助用户了解应用程序的运行状态,如数据加载、文件下载等。本资源“安卓进度条loadingprogress相关-自定义进度条效果.rar”提供了几个...

    vue自定义进度条

    这是一个使用vue动态开发的进度条的小例子,里面同时涵盖了多种样式的属性值动态改变的方法。

    自定义分段式进度条

    在传统的单段进度条中,通常只有一个条形图填充,代表了整个任务的完成程度。而分段式进度条则将任务分为多个阶段,每个阶段有自己的进度指示,更便于用户理解复杂任务的执行情况。 实现自定义分段式进度条的关键...

    C#能用超漂亮进度条

    在WPF中,你可以通过定义资源字典并应用自定义样式来改变进度条的外观,包括边框、填充色、动画效果等。这需要对XAML和CSS类似的语言(如ControlTemplate)有一定的理解。 7. **异步编程与进度条** 当在C#中使用...

    android 圆形自定义进度条源码.rar

    本资源“android 圆形自定义进度条源码.rar”提供了一个圆形进度条的实现,这对于创建视觉效果良好的加载指示或者显示完成度非常有用。 **圆形进度条的基本概念** 圆形进度条是一种图形用户界面组件,通常用于表示...

    自定义进度条

    在IT行业中,自定义进度条是一种常见的用户界面(UI)元素,它允许应用程序以图形化的方式展示任务的完成状态或加载进度。自定义进度条通常用于文件上传、下载、安装程序或其他需要时间的过程,以便用户了解操作的...

Global site tag (gtag.js) - Google Analytics