广告
返回顶部
首页 > 资讯 > 精选 >Android中怎么自定义Progress控件
  • 588
分享到

Android中怎么自定义Progress控件

androidprogress 2023-05-31 00:05:11 588人浏览 安东尼
摘要

Android中怎么自定义Progress控件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主要就是需求就是椭圆进度,百分比跟随渐变背景,这样一想其实就是一个布局,然后控制

Android中怎么自定义Progress控件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

主要就是需求就是椭圆进度,百分比跟随渐变背景,这样一想其实就是一个布局,然后控制里面的进度长度,或者移动,我这是控制长度,这样毕竟简单,而且扩展好,以后进度条有什么奇葩需求也好改。

import android.content.Context;import android.content.res.TypedArray;import android.graphics.Color;import android.support.annotation.AttrRes;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.TextView;public class UpdateProgressBar extends FrameLayout {  private TextView tv_progress;  private int width;  private ViewGroup.LayoutParams params;    private int mOffset;    private float mTextSize;    private int mTextColor;  private float default_text_size;    private int mReachedBarColor;    private int mUnreachedBarColor;  private final int default_reached_color = Color.rgb(66, 145, 241);  private final int default_unreached_color = Color.rgb(204, 204, 204);  private final int default_text_color = Color.rgb(66, 145, 241);  public UpdateProgressBar(@NonNull Context context) {    this(context,null);  }  public UpdateProgressBar(@NonNull Context context, @Nullable AttributeSet attrs) {    this(context, attrs,0);  }  public UpdateProgressBar(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {    super(context, attrs, defStyleAttr);    init(attrs, defStyleAttr);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    int desiredWidth = 100;    int desiredHeight = 100;    int widthMode = MeasureSpec.getMode(widthMeasureSpec);    int widthSize = MeasureSpec.getSize(widthMeasureSpec);    int heightMode = MeasureSpec.getMode(heightMeasureSpec);    int heightSize = MeasureSpec.getSize(heightMeasureSpec);    int height;    //Measure Width    if (widthMode == MeasureSpec.EXACTLY) {      //Must be this size      width = widthSize;    } else if (widthMode == MeasureSpec.AT_MOST) {      //Can't be bigger than...      width = Math.min(desiredWidth, widthSize);    } else {      //Be whatever you want      width = desiredWidth;    }    //Measure Height    if (heightMode == MeasureSpec.EXACTLY) {      //Must be this size      height = heightSize;    } else if (heightMode == MeasureSpec.AT_MOST) {      //Can't be bigger than...      height = Math.min(desiredHeight, heightSize);    } else {      //Be whatever you want      height = desiredHeight;    }    int childCount = getChildCount();    for (int i = 0; i < childCount; i++) {      View child = getChildAt(i);      ViewGroup.LayoutParams lp = child.getLayoutParams();      int childWidthSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width);      int childHeightSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height);      child.measure(childWidthSpec, childHeightSpec);    }    params = tv_progress.getLayoutParams();    params.width = ViewGroup.LayoutParams.WRAP_CONTENT;    params.height = ViewGroup.LayoutParams.MATCH_PARENT;    tv_progress.setLayoutParams(params);    height = tv_progress.getMeasuredHeight();    //MUST CALL THIS    setMeasuredDimension(width, height);  }  private void init(AttributeSet attrs, int defStyleAttr){    default_text_size = 8;    //load styled attributes.    final TypedArray attributes = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.UpdateProgressBar,        defStyleAttr, 0);    mTextSize = attributes.getDimension(R.styleable.UpdateProgressBar_update_text_size, default_text_size);    mReachedBarColor = attributes.getResourceId(R.styleable.UpdateProgressBar_update_reached_color, default_reached_color);    mUnreachedBarColor = attributes.getResourceId(R.styleable.UpdateProgressBar_update_unreached_color, default_unreached_color);    mTextColor = attributes.getColor(R.styleable.UpdateProgressBar_update_text_color, default_text_color);    setDefaultProgressBar();    mOffset = px2dip(3);    attributes.recycle();  }  private void setDefaultProgressBar(){    setBackgroundResource(mUnreachedBarColor);    tv_progress = new TextView(getContext());    tv_progress.setTextSize(mTextSize);    tv_progress.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);    tv_progress.setTextColor(mTextColor);    tv_progress.setLines(1);    tv_progress.setBackgroundResource(mReachedBarColor);    tv_progress.setPadding(0,0,5,1);    tv_progress.setText("0%");    addView(tv_progress);  }  public void setProgress(int progress){    tv_progress.setText(progress+"%");    int proWidth = width*progress/100;    if (tv_progress.getWidth() < proWidth)      params.width = proWidth;//这里不能填充mOffset,因为是椭圆进度条,填充会导致椭圆宽度被进度条覆盖,导致不美观    tv_progress.setLayoutParams(params);  }    public int dip2px(Context context, float dpValue) {    final float scale = context.getResources().getDisplayMetrics().density;    return (int) (dpValue * scale + 0.5f);  }    public int px2dip(float pxValue) {    final float scale = getContext().getResources().getDisplayMetrics().density;    return (int) (pxValue / scale + 0.5f);  }    public int px2sp(float pxValue) {    final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;    return (int) (pxValue / fontScale + 0.5f);  }    public int sp2px(float spValue) {    final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;    return (int) (spValue * fontScale + 0.5f);  }}

用法布局文件

<com.progressbar.example.UpdateProgressBar    xmlns:pro="Http://schemas.android.com/apk/res-auto"    android:id="@+id/progress"    android:layout_width="match_parent"    android:layout_height="wrap_content"    pro:update_text_size="6sp"    pro:update_text_color="#FFFFFF"    pro:update_unreached_color="@drawable/shape_corner_progressbg"    pro:update_reached_color="@drawable/shape_corner_progressbar"/>

MainActivity

import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.support.v7.app.AppCompatActivity;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;import com.progressbar.NumberProgressBar;import java.util.Timer;import java.util.TimerTask;public class MainActivity extends AppCompatActivity {  private Timer timer;  private UpdateProgressBar progressBar;  private int progress;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    progressBar = (UpdateProgressBar)findViewById(R.id.progress);    timer = new Timer();    timer.schedule(new TimerTask() {      @Override      public void run() {        runOnUiThread(new Runnable() {          @Override          public void run() {            progress++;            progressBar.setProgress(progress);            if(progress == 100) {              Toast.makeText(getApplicationContext(), getString(R.string.finish), Toast.LENGTH_SHORT).show();//              progress = 0;//              progressBar.setProgress(0);              timer.cancel();            }          }        });      }    }, 1000, 100);  }  @Override  public boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.main, menu);    return true;  }  @Override  public boolean onOptionsItemSelected(MenuItem item) {    // Handle action bar item clicks here. The action bar will    // automatically handle clicks on the Home/Up button, so long    // as you specify a parent activity in AndroidManifest.xml.    int id = item.getItemId();    if (id == R.id.action_settings) {      return true;    }    return super.onOptionsItemSelected(item);  }  @Override  protected void onDestroy() {    super.onDestroy();    timer.cancel();  }}

渐变背景

<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">  <solid android:color="#4984f2"/>  <gradient    android:startColor="#4984f2"    android:endColor="#000" />  <corners    android:topLeftRadius="15dp"    android:topRightRadius="15dp"    android:bottomLeftRadius="15dp"    android:bottomRightRadius="15dp"/></shape>
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">  <solid android:color="#dadada"/>  <gradient  android:startColor="#FFF"  android:endColor="#000" />  <corners    android:topLeftRadius="15dp"    android:topRightRadius="15dp"    android:bottomLeftRadius="15dp"    android:bottomRightRadius="15dp"/></shape>

关于Android中怎么自定义Progress控件问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Android中怎么自定义Progress控件

本文链接: https://www.lsjlt.com/news/222297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中怎么自定义Progress控件
    Android中怎么自定义Progress控件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主要就是需求就是椭圆进度,百分比跟随渐变背景,这样一想其实就是一个布局,然后控制...
    99+
    2023-05-31
    android progress
  • Android中怎么自定义选择控件
    本篇文章为大家展示了Android中怎么自定义选择控件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、自定义DialogDialog布局文件<xml version="1...
    99+
    2023-05-30
    android
  • android怎么自定义组合控件
    要自定义一个组合控件,你可以按照以下步骤进行:1. 创建一个新的类,继承自现有的Android控件类,例如LinearLayout或...
    99+
    2023-08-09
    android
  • android怎么自定义开关控件
    要自定义开关控件,可以使用以下步骤:1. 创建一个自定义的开关控件类,继承自Switch或CompoundButton类。2. 在自...
    99+
    2023-08-16
    android
  • Android怎么在XML文件中自定义控件
    今天小编给大家分享一下Android怎么在XML文件中自定义控件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、为什么需要...
    99+
    2023-07-05
  • Android自定义控件之自定义组合控件(三)
    前言: 前两篇介绍了自定义控件的基础原理Android自定义控件基本原理详解(一)、Android自定义控件之自定义属性(二)。今天重点介绍一下如何通过自定义组合控件来提高布...
    99+
    2022-06-06
    Android
  • 怎么在Android中自定义一个控件
    怎么在Android中自定义一个控件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码class SleepDayChart(context: Contex...
    99+
    2023-06-14
  • 怎么在Android中自定义一个ProgressBar控件
    这篇文章将为大家详细讲解有关怎么在Android中自定义一个ProgressBar控件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。首先加载Drawable,在onMeasure设置好其区域...
    99+
    2023-05-30
    android progressbar
  • Android自定义控件之自定义属性(二)
    前言: 上篇介绍了自定义控件的基本要求以及绘制的基本原理,本篇文章主要介绍如何给自定义控件自定义一些属性。本篇文章将继续以上篇文章自定义圆形百分比为例进行讲解。有关原理知识请参...
    99+
    2022-06-06
    属性 自定义属性 Android
  • Android怎么自定义双向滑动控件
    这篇文章主要介绍“Android怎么自定义双向滑动控件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么自定义双向滑动控件”文章能帮助大家解决问题。先看一下效果图1.SeekBarPr...
    99+
    2023-06-30
  • 怎么在Android中实现一个自定义控件
    今天就跟大家聊聊有关怎么在Android中实现一个自定义控件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先定义一个layout实现按钮内部布局:<xml vers...
    99+
    2023-05-31
    android
  • 怎么中Android中自定义一个悬浮窗控件
    今天就跟大家聊聊有关怎么中Android中自定义一个悬浮窗控件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。第一步设计类似Toast的类FloatWindowpackage ...
    99+
    2023-05-31
    android roi %d
  • Android怎么实现自定义折线图控件
    这篇“Android怎么实现自定义折线图控件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android怎么实现自定义折线图...
    99+
    2023-07-02
  • android 自定义控件 使用declare
    在Android中,可以使用`declare-styleable`来定义和使用自定义控件的属性。下面是一个简单的示例:1. 在res...
    99+
    2023-09-21
    Android
  • android 自定义控件 自定义属性详细介绍
    自定义控件在android中无处不见,自定义控件给了我们很大的方便。比如说,一个视图为imageview ,imagebutton ,textview 等诸多控件的组合,用的地...
    99+
    2022-06-06
    自定义 自定义控件 属性 自定义属性 Android
  • Android自定义控件如何在XML文件中使用自定义属性
    目录前言一、为什么需要自定义控件二、具体步骤1.首先我们创建一个 layout xml文件:2.为自定义控件创建java类:3.在res/values下,新建一个attrs.xml文...
    99+
    2023-05-14
    Android XML自定义属性 Android 自定义控件
  • Android开发怎么自定义实时图表控件
    本文小编为大家详细介绍“Android开发怎么自定义实时图表控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android开发怎么自定义实时图表控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。演示环境开发工...
    99+
    2023-07-02
  • android自定义View之复合控件
    复合控件可以很好地创建出具有重用功能的控件集合。 很多的APP都有一些共通的UI界面,为了统一应用程序的风格,下面我们就以一个Topbar为实例讲解复合控件。 实现效果如图: 第一...
    99+
    2022-11-12
  • Android自定义实现日历控件
    本文实例为大家分享了Android自定义实现日历控件的具体代码,供大家参考,具体内容如下 1. Calendar类 2. 布局 创建calendar_layout.xml <...
    99+
    2022-11-12
  • Android自定义星星评分控件
    下面为控件的实现历程: 此控件高效,直接使用ondraw绘制,先亮照: 由于Android自身的星星评分控件样式可以改,但是他的大小不好调整的缺点,只能用small n...
    99+
    2022-06-06
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作