好名容易记住你 發表於 2026-4-25 23:22:00

DecoView的使用

<p><span style="font-size: 15px">DecoView是一款专为Android平台设计的动画圆形图表库,能让你轻松打造出类似Google Fit那样的炫酷圆环视图.它的自定义选项很丰富,无论是数据序列(SeriesItem)还是动画事件(DecoEvent),从颜色到线条粗细都能精细配置.而且直接写在XML布局里就行,代码调用也很简单,做些健身,智能家居之类的App时用来展示进度或实时数据,效果会非常直观生动.</span></p>
<p><span style="font-size: 18px">1. 引入DecoView的库</span></p>
<p><span style="font-size: 15px">在Android项目的build.gradle(Module :app)中添加,然后在Sync.</span></p>
<div class="cnblogs_code">
<pre>implementation 'com.github.bmarrdev:android-DecoView-charting:v1.2'</pre>
</div>
<p><span style="font-size: 15px">如果出现下面的错误:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub$Proxy found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.IResultReceiver found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.IResultReceiver$Stub$Proxy found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.ResultReceiver found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.ResultReceiver$1 found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.ResultReceiver$MyResultReceiver found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)
Duplicate class android.support.v4.os.ResultReceiver$MyRunnable found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-23.3.0-runtime (com.android.support:support-v4:23.3.0)

Go to the documentation to learn how to Fix dependency resolution errors.</span></pre>
</div>
<p><span style="font-size: 15px">这个问题的核心是项目的依赖项中同时混用了老旧的Android Support库和现代的AndroidX库,而你的项目本身很可能已经迁移到了AndroidX.Android官方已经停止维护Support库,并推荐所有项目迁移到AndroidX.因此,唯一的解决方案是彻底清理项目中的Support库依赖.解决这个问题的唯一方法是彻底清除项目中对Support库的依赖.在gradle.properties文件中添加:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"># 启用AndroidX库
android.useAndroidX=true
# 启用Jetifier,将第三方库中的Support库自动转换为AndroidX
android.enableJetifier=true</span></pre>
</div>
<p><span style="font-size: 18px">2. 在项目中添加如下的布局文件cardview_deco.xml:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">androidx.cardview.widget.CardView
    </span><span style="color: rgba(255, 0, 0, 1)">xmlns:android</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"</span><span style="color: rgba(255, 0, 0, 1)">
    xmlns:app</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res-auto"</span><span style="color: rgba(255, 0, 0, 1)">
    xmlns:tools</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/tools"</span><span style="color: rgba(255, 0, 0, 1)">
    android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/time_item_cardview2"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_margin</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
    app:cardUseCompatPadding</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(255, 0, 0, 1)">
    app:cardBackgroundColor</span><span style="color: rgba(0, 0, 255, 1)">="@android:color/transparent"</span><span style="color: rgba(255, 0, 0, 1)">
    app:cardElevation</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
    app:cardMaxElevation</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
    android:clipChildren</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(255, 0, 0, 1)">
    android:clipToPadding</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">FrameLayout
      </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
      android:orientation</span><span style="color: rgba(0, 0, 255, 1)">="vertical"</span><span style="color: rgba(255, 0, 0, 1)">
      android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingTop</span><span style="color: rgba(0, 0, 255, 1)">="4dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:paddingBottom</span><span style="color: rgba(0, 0, 255, 1)">="8dp"</span><span style="color: rgba(255, 0, 0, 1)">
      android:clipChildren</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(255, 0, 0, 1)">
      android:clipToPadding</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<br><br>      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">FrameLayout
            </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
            android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
            android:paddingHorizontal</span><span style="color: rgba(0, 0, 255, 1)">="12dp"</span><span style="color: rgba(255, 0, 0, 1)">
            android:clipChildren</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(255, 0, 0, 1)">
            android:clipToPadding</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">FrameLayout
                </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
                android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">com.hookedonplay.decoviewlib.DecoView
                  </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/pie_chart_time2"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="280dp"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="280dp"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_gravity</span><span style="color: rgba(0, 0, 255, 1)">="center"</span><span style="color: rgba(255, 0, 0, 1)">
                  tools:ignore</span><span style="color: rgba(0, 0, 255, 1)">="MissingClass"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">FrameLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout
                </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
                android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="200dp"</span><span style="color: rgba(255, 0, 0, 1)">
                android:layout_gravity</span><span style="color: rgba(0, 0, 255, 1)">="center"</span><span style="color: rgba(255, 0, 0, 1)">
                android:orientation</span><span style="color: rgba(0, 0, 255, 1)">="vertical"</span><span style="color: rgba(255, 0, 0, 1)">
                android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center_horizontal"</span><span style="color: rgba(255, 0, 0, 1)">
                android:padding</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span><span style="color: rgba(255, 0, 0, 1)">
                android:clipChildren</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(255, 0, 0, 1)">
                android:clipToPadding</span><span style="color: rgba(0, 0, 255, 1)">="false"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">Space
                  </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="40dp"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">TextView
                  </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/txt_day"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:text</span><span style="color: rgba(0, 0, 255, 1)">="Click"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:fontFeatureSettings</span><span style="color: rgba(0, 0, 255, 1)">="tnum"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:textColor</span><span style="color: rgba(0, 0, 255, 1)">="@android:color/black"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:textSize</span><span style="color: rgba(0, 0, 255, 1)">="28sp"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:textStyle</span><span style="color: rgba(0, 0, 255, 1)">="bold"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
<br><br>                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout
                  </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:orientation</span><span style="color: rgba(0, 0, 255, 1)">="vertical"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_weight</span><span style="color: rgba(0, 0, 255, 1)">="1"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

                  <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout
                        </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
                        android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
                        android:orientation</span><span style="color: rgba(0, 0, 255, 1)">="horizontal"</span><span style="color: rgba(255, 0, 0, 1)">
                        android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

                  <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;<br><br></span>
                <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">Space
                  </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="0dp"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

                <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">Space
                  </span><span style="color: rgba(255, 0, 0, 1)">android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
                  android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="10dp"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

            <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">FrameLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">FrameLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">androidx.cardview.widget.CardView</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><span style="font-size: 15px">activity_main.xml改成:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">xml version="1.0" encoding="utf-8"</span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">androidx.constraintlayout.widget.ConstraintLayout </span><span style="color: rgba(255, 0, 0, 1)">xmlns:android</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"</span><span style="color: rgba(255, 0, 0, 1)">
    xmlns:app</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res-auto"</span><span style="color: rgba(255, 0, 0, 1)">
    xmlns:tools</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/tools"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
    android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
    tools:context</span><span style="color: rgba(0, 0, 255, 1)">=".MainActivity"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout
      </span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/container_deco"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
      android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
      android:orientation</span><span style="color: rgba(0, 0, 255, 1)">="vertical"</span><span style="color: rgba(255, 0, 0, 1)">
      tools:ignore</span><span style="color: rgba(0, 0, 255, 1)">="MissingConstraints"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">LinearLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">androidx.constraintlayout.widget.ConstraintLayout</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p><span style="font-size: 18px">3. MainActivity.java文件:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">package</span><span style="color: rgba(0, 0, 0, 1)"> com.example.myapplication;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> androidx.appcompat.app.AppCompatActivity;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.graphics.Color;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.os.Bundle;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.os.Handler;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.os.Looper;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.view.LayoutInflater;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.view.View;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.widget.LinearLayout;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> android.widget.TextView;

</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.hookedonplay.decoviewlib.DecoView;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.hookedonplay.decoviewlib.charts.SeriesItem;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> com.hookedonplay.decoviewlib.events.DecoEvent;

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MainActivity <span style="color: rgba(0, 0, 255, 1)">extends</span><span style="color: rgba(0, 0, 0, 1)"> AppCompatActivity {

    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> LinearLayout cardViewContainer;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> TextView txtDays;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> DecoView decoView;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> SeriesItem redSeries;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> redSeriesIndex;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">int</span> currentAngle = 0<span style="color: rgba(0, 0, 0, 1)">;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Handler timerHandler;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Runnable timerRunnable;
    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span> clicked = <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
      </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      cardViewContainer </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.container_deco);
      LayoutInflater inflater </span>= LayoutInflater.from(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">);
      View view </span>= inflater.inflate(R.layout.cardview_deco, cardViewContainer, <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">);
      cardViewContainer.addView(view);
      txtDays </span>=<span style="color: rgba(0, 0, 0, 1)"> view.findViewById(R.id.txt_day);
      initDecoView();

      txtDays.setOnClickListener(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> View.OnClickListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onClick(View view) {
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> newProgress = currentAngle + 5<span style="color: rgba(0, 0, 0, 1)">;

                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (newProgress &gt; 100<span style="color: rgba(0, 0, 0, 1)">) {
                  newProgress </span>= 100<span style="color: rgba(0, 0, 0, 1)">;
                }

                DecoEvent event </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DecoEvent.Builder(newProgress)
                        .setIndex(redSeriesIndex)                  
                        .setDuration(</span>500<span style="color: rgba(0, 0, 0, 1)">)                        
                        .build();
                decoView.addEvent(event);

                currentAngle </span>=<span style="color: rgba(0, 0, 0, 1)"> newProgress;
                clicked </span>= !<span style="color: rgba(0, 0, 0, 1)">clicked;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (clicked) {
                  txtDays.setText(</span>"Clicked!"<span style="color: rgba(0, 0, 0, 1)">);
                }
                </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
                  txtDays.setText(</span>"Clicked again!"<span style="color: rgba(0, 0, 0, 1)">);
                }
            }
      });

    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> initDecoView() {
      decoView </span>=<span style="color: rgba(0, 0, 0, 1)"> findViewById(R.id.pie_chart_time2);
      decoView.configureAngles(</span>360, 0<span style="color: rgba(0, 0, 0, 1)">);

      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建灰色背景</span>
      SeriesItem backgroundSeries = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SeriesItem.Builder(Color.GRAY)
                .setRange(</span>0, 100, 100<span style="color: rgba(0, 0, 0, 1)">)
                .setLineWidth(40f)
                .build();
      decoView.addSeries(backgroundSeries);

      SeriesItem redSeries </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SeriesItem.Builder(Color.RED)
                .setRange(</span>0, 100, 0<span style="color: rgba(0, 0, 0, 1)">)
                .setLineWidth(40f)
                .build();
      redSeriesIndex </span>=<span style="color: rgba(0, 0, 0, 1)"> decoView.addSeries(redSeries);

      startAngleIncrease();
    }

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> startAngleIncrease() {
      timerHandler </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Handler(Looper.getMainLooper());
      timerRunnable </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Runnable() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> run() {
                currentAngle </span>= (currentAngle + 1) % 360<span style="color: rgba(0, 0, 0, 1)">;

                DecoEvent event </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> DecoEvent.Builder(currentAngle)
                        .setIndex(redSeriesIndex)
                        .setDuration(</span>500<span style="color: rgba(0, 0, 0, 1)">)
                        .build();
                decoView.addEvent(event);

                timerHandler.postDelayed(</span><span style="color: rgba(0, 0, 255, 1)">this</span>, 1000<span style="color: rgba(0, 0, 0, 1)">);
            }
      };
      timerHandler.post(timerRunnable);
    }
}</span></pre>
</div>
<p><span style="font-size: 15px">上面的代码实现了下面的功能:绘制底色为灰色的红色圆环,点击一下圆环中间的文本,红色圆环增加5°,每秒钟红色圆环增加1°.</span></p>
<p><img src="https://img2024.cnblogs.com/blog/573274/202604/573274-20260425232035527-1308080852.png" alt="bafc184d3b1d1e18bf4833e93c668d03" width="298" height="663" loading="lazy" style="display: block; margin-left: auto; margin-right: auto"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/mstk/p/19930799
頁: [1]
查看完整版本: DecoView的使用