【问题标题】:Circular Progress Bar ( for a countdown timer )圆形进度条(用于倒数计时器)
【发布时间】:2013-11-29 10:21:33
【问题描述】:

好的,我有一个 15 秒的倒计时计时器,它工作得非常好,我想为那个计时器制作一个自定义的圆形进度条。

我想创建一个完整的圆圈,当计时器下降时取出“馅饼片(圆圈)”,直到不再有圆圈。

我更愿意自己制作形状而不是使用预制图像,因为我希望任何手机上的质量都很好。我该怎么办?谢谢!

【问题讨论】:

    标签: android xml android-animation countdowntimer


    【解决方案1】:

    我觉得这个例子很好:http://mrigaen.blogspot.it/2013/12/create-circular-progress-bar-in-android.html

    所以我以这种方式创建了我的进度条

    <ProgressBar
        android:id="@+id/barTimer"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_centerInParent="true"
        android:progressDrawable="@drawable/circular_progress_bar" />
    

    然后我为倒计时做了一个函数,其中:

    private void startTimer(final int minuti) {
        countDownTimer = new CountDownTimer(60 * minuti * 1000, 500) {
            // 500 means, onTick function will be called at every 500 milliseconds
    
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                long seconds = leftTimeInMilliseconds / 1000;
                int barVal= (barMax) - ((int)(seconds/60*100)+(int)(seconds%60));
                barTimer.setProgress(barVal);
                textTimer.setText(String.format("%02d", seconds/60) + ":" + String.format("%02d", seconds%60));
                // format the textview to show the easily readable format
    
            }
            @Override
            public void onFinish() {
                if(textTimer.getText().equals("00:00")){
                    textTimer.setText("STOP");          
                }
                else{
                    textTimer.setText("2:00");
                }
            }
        }.start();
    
    }
    

    更新

    private void startTimer(final int minuti) {
        countDownTimer = new CountDownTimer(60 * minuti * 1000, 500) {
            // 500 means, onTick function will be called at every 500 milliseconds
    
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                long seconds = leftTimeInMilliseconds / 1000;
                barTimer.setProgress((int)seconds);
                textTimer.setText(String.format("%02d", seconds/60) + ":" + String.format("%02d", seconds%60));
                // format the textview to show the easily readable format
    
            }
            @Override
            public void onFinish() {
                if(textTimer.getText().equals("00:00")){
                    textTimer.setText("STOP"); 
                }
                else{
                    textTimer.setText("2:00");
                    barTimer.setProgress(60*minuti);
                }
            }
        }.start();
    
    }  
    

    【讨论】:

    • 在这一行中,int barVal= (barMax) - ((int)(seconds/60*100)+(int)(seconds%60)); - 什么是 barMax?
    • 什么是 barMax? @Grace Pii
    • BarMax 是倒数计时器应该开始的最大值。就我而言,因为我从 2 分钟开始,barMax 是 2 分钟。然后我从中减去秒数!
    • @GracePii 我尝试了这个函数,但我在 barMax 上遇到错误,我收到空指针异常。你给 barMax 的值是多少?
    • 我上面写的,BarMax 是倒数计时器开始的值。我希望它从 2 分钟开始,所以我输入 barMax=2 分钟。自从我写这篇文章以来,我已经更改了代码。现在就像我在上面的更新中写的那样。
    【解决方案2】:

    圆滑的进度条计时器

    XML 布局:

    activity_main

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/reativelayout"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true">
    
    <ProgressBar
        android:id="@+id/progressbar_timerview"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="260dp"
        android:layout_height="260dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_horizontal|bottom"
        android:indeterminate="false"
        android:progressDrawable="@drawable/circleshape2_timerview" />
    
     <TextView
        android:id="@+id/textView_timerview_time"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:alpha="0.6"
        android:background="@drawable/circleshape_timerview"
        android:gravity="center"
        android:text="00:00"
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:textStyle="bold" />
    
     <ProgressBar
        android:id="@+id/progressbar1_timerview"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="260dp"
        android:layout_height="260dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_horizontal|center"
        android:indeterminate="false"
        android:progressDrawable="@drawable/circleshape1_timerview"
        android:visibility="gone" />
    
    <Button
        android:id="@+id/button_timerview_start"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"
        android:background="@android:color/transparent"
        android:text="Start !"
        android:textAllCaps="false"
        android:textSize="20sp"
        android:textStyle="italic" />
    
    
     <Button
        android:id="@+id/button_timerview_stop"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"
        android:background="@android:color/transparent"
        android:text="Stop !"
        android:layout_marginTop="30dp"
        android:textAllCaps="false"
        android:textSize="20sp"
        android:visibility="invisible"
        android:textStyle="italic"
        />
    
    <EditText
        android:id="@+id/textview_timerview_back"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:padding="5dp"
        android:layout_marginBottom="30dp"
        android:textSize="35sp"
        android:hint=""/>
      </RelativeLayout>
    

    可绘制文件:

    circleshape2_timerview

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@android:id/progress">
            <shape
                android:innerRadiusRatio="5"
                android:shape="ring"
                android:thicknessRatio="20.0"
    
                android:useLevel="false"
                android:visible="true">
                <gradient
                    android:centerColor="#FF00"
                    android:endColor="#FF00"
                    android:startColor="#FF00ff"
                    android:type="sweep" />
            </shape>
        </item>
    </layer-list>
    

    circleshape1_timerview

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:id="@android:id/progress">
            <rotate
                android:fromDegrees="270"
                android:toDegrees="-90">
                <shape
                    android:innerRadiusRatio="5"
                    android:shape="ring"
                    android:thicknessRatio="20.0"
    
                    android:useLevel="true"
                    android:visible="true">
                    <gradient
                        android:centerColor="#FF00"
                        android:endColor="#FF00"
                        android:startColor="#FF00ff"
                        android:type="sweep" />
                </shape>
            </rotate>
    
        </item>
    </layer-list>
    

    circleshape_timerview

     <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item>
        <shape android:shape="oval">
    
            <solid android:color="#bbb"/>
        </shape>
     </item>
     </selector>
    

    活动:

    MainActivity

     import android.app.Activity;
     import android.os.Bundle;
     import android.os.CountDownTimer;
     import android.view.View;
     import android.view.View.OnClickListener;
     import android.widget.Button;
     import android.widget.EditText;
     import android.widget.ProgressBar;
     import android.widget.TextView;
     import android.widget.Toast;
    
     public class MainActivity extends Activity implements OnClickListener {
    
    int i = -1;
    ProgressBar mProgressBar, mProgressBar1;
    
    private Button buttonStartTime, buttonStopTime;
    private EditText edtTimerValue;
    private TextView textViewShowTime;
    private CountDownTimer countDownTimer;
    private long totalTimeCountInMilliseconds;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
        buttonStartTime = (Button) findViewById(R.id.button_timerview_start);
        buttonStopTime = (Button) findViewById(R.id.button_timerview_stop);
    
        textViewShowTime = (TextView)  
        findViewById(R.id.textView_timerview_time);
        edtTimerValue = (EditText) findViewById(R.id.textview_timerview_back);
    
        buttonStartTime.setOnClickListener(this);
        buttonStopTime.setOnClickListener(this);
    
        mProgressBar = (ProgressBar) findViewById(R.id.progressbar_timerview);
        mProgressBar1 = (ProgressBar) findViewById(R.id.progressbar1_timerview);
    
      }
      @Override
      public void onClick(View v) {
        if (v.getId() == R.id.button_timerview_start) {
    
            setTimer();
    
            buttonStartTime.setVisibility(View.INVISIBLE);
            buttonStopTime.setVisibility(View.VISIBLE);
            mProgressBar.setVisibility(View.INVISIBLE);
    
            startTimer();
            mProgressBar1.setVisibility(View.VISIBLE);
    
    
        } else if (v.getId() == R.id.button_timerview_stop) {
            countDownTimer.cancel();
            countDownTimer.onFinish();
            mProgressBar1.setVisibility(View.GONE);
            mProgressBar.setVisibility(View.VISIBLE);
            edtTimerValue.setVisibility(View.VISIBLE);
            buttonStartTime.setVisibility(View.VISIBLE);
            buttonStopTime.setVisibility(View.INVISIBLE);
        }
     }
      private void setTimer(){
        int time = 0;
        if (!edtTimerValue.getText().toString().equals("")) {
            time = Integer.parseInt(edtTimerValue.getText().toString());
        } else
            Toast.makeText(MainActivity.this, "Please Enter Minutes...",  
      Toast.LENGTH_LONG).show();
        totalTimeCountInMilliseconds =  time * 1000;
        mProgressBar1.setMax( time * 1000);
       }
       private void startTimer() {
        countDownTimer = new CountDownTimer(totalTimeCountInMilliseconds, 1) {
            @Override
            public void onTick(long leftTimeInMilliseconds) {
                long seconds = leftTimeInMilliseconds / 1000;
                mProgressBar1.setProgress((int) (leftTimeInMilliseconds));
    
                textViewShowTime.setText(String.format("%02d", seconds / 60)
                        + ":" + String.format("%02d", seconds % 60));
            }
            @Override
            public void onFinish() {
                textViewShowTime.setText("00:00");
                textViewShowTime.setVisibility(View.VISIBLE);
                buttonStartTime.setVisibility(View.VISIBLE);
                buttonStopTime.setVisibility(View.VISIBLE);
                mProgressBar.setVisibility(View.VISIBLE);
                mProgressBar1.setVisibility(View.GONE);
    
            }
        }.start();
     }
     }
    

    【讨论】:

    • 谢谢仙女座
    • 顺时针我们可以添加什么值“circleshape1_timerview”文件
    • 我得到了解决方案
    【解决方案3】:

    要创建自定义组件,请查看Android API Guide。基本方法摘录:

    1. 用您自己的类扩展现有的视图类或子类。
    2. 覆盖超类中的一些方法。重写的超类方法以'on'开头,例如onDraw(), onMeasure() 和 onKeyDown()。这类似于 on... 中的事件 您为生命周期和其他内容覆盖的 Activity 或 ListActivity 功能挂钩。
    3. 使用新的扩展类。完成后,您可以使用新的扩展类代替它所基于的视图。

    另外,请在 https://github.com/Todd-Davies/ProgressWheel 上查看 Todd Davies 的进度轮,这应该可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多