-
Circle-Progress-View:适用于Android的动画循环进度视图-源码
2021-01-31 06:36:29可用作负载指示器并以循环方式显示进度或值。 在搜寻模式下,它也可以用来设置一个值。 尝试。 全动画: 动画设定值。 旋转模式。 从旋转模式转换为值模式。 完全可定制的: 所有零件都具有可自定义的颜色和... -
Java渐变进度条_Android ProgressBar自定义图片进度,自定义渐变色进度条
2021-03-15 11:50:36java.lang.Object↳android.view.View↳android.widget.ProgressBar直接子类AbsSeekBar间接子类RatingBar, SeekBar在某些操作的进度中的可视指示器,为用户...在不确定模式下,进度条显示循环动画。这种模式常用于应...java.lang.Object
↳android.view.View
↳android.widget.ProgressBar
直接子类
AbsSeekBar
间接子类
RatingBar, SeekBar
在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中
1、android.widget. ProgressBar,继承自android.view.View 。在android.widget包中。对应对话框ProgressDialog。ProgressBar有两种展示方式,表盘形式(普通、小、大)和条形填充形式。在layout定义时,需要通过设施style属性类设置展示方式。
ProgressBar的样式有四种:
android:progressBarStyle:默认进度条样式,不确定模式
android:progressBarStyleHorizontal:水平进度条样式
android:progressBarStyleLarge :大号进度条样式,也是不确定进度模式
android:progressBarStyleSmall :小号进度条样式,也是不确定进度模式
二、XML重要属性
android:max-- 这事进度条长度最大值
android:progressBarStyle:默认进度条样式
android:progressBarStyleHorizontal:水平样式
style="?android:attr/progressBarStyleLarge" --- 属性风格类型--大圆圈,如下图
style=”?android:attr/progressBarStyleSmall”--- 属性风格类型--小圆圈,如下图:
style="?android:attr/progressBarStyleHorizontal" --水平进度条 --如下图:
几秒钟之后自动滚到到如下:
也可以用下面的形式代替上面的形式的:
//中
//大圆
//小圆
三、重要方法
getMax():返回这个进度条的范围的上限
getProgress():返回当前进度值
getSecondaryProgress():返回次要当前进度值
incrementProgressBy(int diff):指定增加的进度--即步长
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
四、重要事件
onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
接下来看案例:
1.定义一个布局文件progressbar.xml
android:layout_width="fill_parent"
android:layout_height="match_parent"
>
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/startText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="垂直的----标题上面也有一个进度条哦"
android:textColor="#CD0000"
android:background="#BC8F8F"
/>
android:id="@+id/progtessBer_btn_id1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleLarge"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleSmall"
android:layout_gravity="center_horizontal"
/>
android:id="@+id/startText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="水平的"
android:textColor="#aaaaaa"
/>
android:id="@+id/progtessBer_btn_id2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/progress_text"
/>
2.之后定义java文件:ProgressBarDemo.java
package com.dream.app.start.first.prograssbar;
import com.dream.app.start.MenuDemo;
import com.dream.app.start.R;
import com.dream.app.start.R.id;
import com.dream.app.start.R.layout;
import com.dream.app.start.utils.PublicClass;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ProgressBarDemo extends PublicClass {
private ProgressBar progressbar,progressbar_1;
Button btn1,btn2;
private int prostatus=0;
//创建一个handler对象
private Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//在标题条里放置进度条。请求窗口特色风格,这里设置成不明确的进度风格
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
//设置窗口进度条特性风格
// requestWindowFeature(Window.FEATURE_PROGRESS);
setContentView(R.layout.progressbar);
//设置标题栏中的不明确的进度条是否可以显示,当你需要表示处理中的时候设置为True,处理完毕后设置为false
setProgressBarIndeterminateVisibility(true);
//设置进度条进度值,要乘以100的
// setProgress(60*100);
// setSecondaryProgress(80*100);
btn2=(Button)findViewById(R.id.button_cancel);
//btn2.setOnClickListener(onClick);
progressbar=(ProgressBar)findViewById(R.id.progtessBer_btn_id2);
progressbar_1=(ProgressBar)findViewById(R.id.progtessBer_btn_id1);
//设置进度条的最大值
progressbar.setMax(100000);
progressbar_1.setMax(100000);
//新开启一个进程
new Thread(new Runnable() {
@Override
public void run() {
// 循环1000次,不断地更新prostatus状态值
while (prostatus++<100000) {
//将一个Runnable对象添加到消息队列中去
//并且当执行该对象的时候,执行run
handler.post(new Runnable() {
@Override
public void run() {
//重新设置进度条当前的值
progressbar.setProgress(prostatus);
progressbar_1.setProgress(prostatus);
}
});
}
}
}).start();
}
//toast方法
private void toastshow(String str) {
Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
}
}
运行效果如下:
二:用图片实现滚动效果:
1.添加图片到drawable下
2.自定义图片资源文件iamge_progress.xml
xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/image_progress"
android:pivotX="50%"
android:pivotY="50%"
/>
3.定义布局文件,progress.xml
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
android:indeterminateDrawable="@drawable/drawable_progress"
android:layout_height="100dp"
android:layout_width="100dp"/>
运行效果如下:
三》自定义渐变色进度条:
定义drawable资源文件color_progressbar.xml
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:angle="270"
/>
>
android:endColor="#AEEEEE"
android:angle="270" />
2.定义对应的不布局文件:progressbar.xml在此文件中引用我们定义的drawable资源配置文件
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
android:id="@+id/color_progressBar"
android:indeterminateDrawable="@drawable/color_progress"
android:layout_height="wrap_content"
android:layout_width="match_parent"/>
或者在代码中给进度条设置自定义资源文件:
效果如下:
四:自定义progressbar颜色:
1.定义一个图片资源文件:
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" >
android:innerRadiusRatio="3"
android:shape="ring"
android:thicknessRatio="8"
android:useLevel="false" >
android:centerColor="#FFFFFF"
android:centerY="0.50"
android:endColor="#FFFF00"
android:startColor="#000000"
android:type="sweep"
android:useLevel="false" />
2.定义布局文件:
android:id="@+id/color_progressBar2"
android:indeterminateDrawable="@drawable/color_progress2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
3.效果:
-
Android ProgressBar自定义图片进度,自定义渐变色进度条
2015-03-06 17:37:31在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中 1、android.widget. ProgressBar...在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中
1、android.widget. ProgressBar,继承自android.view.View 。在android.widget包中。对应对话框ProgressDialog。ProgressBar有两种展示方式,表盘形式(普通、小、大)和条形填充形式。在layout定义时,需要通过设施style属性类设置展示方式。
ProgressBar的样式有四种:
android:progressBarStyle:默认进度条样式,不确定模式
android:progressBarStyleHorizontal:水平进度条样式
android:progressBarStyleLarge :大号进度条样式,也是不确定进度模式android:progressBarStyleSmall :小号进度条样式,也是不确定进度模式
二、XML重要属性
android:max-- 这事进度条长度最大值
android:progress--设定度条当前进度值
android:secondaryProgress--第二进度条进度值
android:progressBarStyle:默认进度条样式
android:progressBarStyleHorizontal:水平样式
style
=
"?android:attr/progressBarStyleLarge" --- 属性风格类型--大圆圈,如下图
style=”?android:attr/progressBarStyleSmall”
--- 属性风格类型--小圆圈,如下图:style="?android:attr/progressBarStyleHorizontal" --水平进度条 --
如下图:几秒钟之后自动滚到到如下:
也可以用下面的形式代替上面的形式的:
<ProgressBar style="@android:style/Widget.ProgressBar.Inverse"/>//中 <ProgressBar style="@android:style/Widget.ProgressBar.Large.Inverse"/> //大圆 <ProgressBar style="@android:style/Widget.ProgressBar.Small.Inverse"/> //小圆
三、重要方法
getMax():返回这个进度条的范围的上限
getProgress():返回当前进度值
getSecondaryProgress():返回次要当前进度值
incrementProgressBy(int diff):指定增加的进度--即步长
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
四、重要事件
onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
接下来看案例:
1.定义一个布局文件progressbar.xml
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/startText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="垂直的----标题上面也有一个进度条哦" android:textColor="#CD0000" android:background="#BC8F8F" /> <!-- style=”?android:attr/progressBarStyleLarge”大圆圈 --> <ProgressBar android:id="@+id/progtessBer_btn_id1" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleLarge" /> <!-- style=”?android:attr/progressBarStyleSmall”小圆圈 --> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:attr/progressBarStyleSmall" android:layout_gravity="center_horizontal" /> <TextView android:id="@+id/startText1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="水平的" android:textColor="#aaaaaa" /> <!-- style="?android:attr/progressBarStyleHorizontal" 水平进度条 --> <ProgressBar android:id="@+id/progtessBer_btn_id2" android:layout_width="fill_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/progress_text" /> </LinearLayout> </ScrollView>
2.之后定义java文件:ProgressBarDemo.javapackage com.dream.app.start.first.prograssbar; import com.dream.app.start.MenuDemo; import com.dream.app.start.R; import com.dream.app.start.R.id; import com.dream.app.start.R.layout; import com.dream.app.start.utils.PublicClass; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.text.method.ScrollingMovementMethod; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class ProgressBarDemo extends PublicClass { private ProgressBar progressbar,progressbar_1; Button btn1,btn2; private int prostatus=0; //创建一个handler对象 private Handler handler=new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //在标题条里放置进度条。请求窗口特色风格,这里设置成不明确的进度风格 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); //设置窗口进度条特性风格 // requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.progressbar); //设置标题栏中的不明确的进度条是否可以显示,当你需要表示处理中的时候设置为True,处理完毕后设置为false setProgressBarIndeterminateVisibility(true); //设置进度条进度值,要乘以100的 // setProgress(60*100); // setSecondaryProgress(80*100); btn2=(Button)findViewById(R.id.button_cancel); // btn2.setOnClickListener(onClick); progressbar=(ProgressBar)findViewById(R.id.progtessBer_btn_id2); progressbar_1=(ProgressBar)findViewById(R.id.progtessBer_btn_id1); //设置进度条的最大值 progressbar.setMax(100000); progressbar_1.setMax(100000); //新开启一个进程 new Thread(new Runnable() { @Override public void run() { // 循环1000次,不断地更新prostatus状态值 while (prostatus++<100000) { //将一个Runnable对象添加到消息队列中去 //并且当执行该对象的时候,执行run handler.post(new Runnable() { @Override public void run() { //重新设置进度条当前的值 progressbar.setProgress(prostatus); progressbar_1.setProgress(prostatus); } }); } } }).start(); } //toast方法 private void toastshow(String str) { Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show(); } }
运行效果如下:二:用图片实现滚动效果:
1.添加图片到drawable下
2.自定义图片资源文件iamge_progress.xml
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/image_progress" android:pivotX="50%" android:pivotY="50%" />
3.定义布局文件,progress.xml<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ProgressBar android:indeterminateDrawable="@drawable/drawable_progress" android:layout_height="100dp" android:layout_width="100dp"/> </LinearLayout>
运行效果如下:三》自定义渐变色进度条:
定义drawable资源文件color_progressbar.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"> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#ff9d9e9d" android:centerColor="#ff5a5d5a" android:centerY="0.75" android:endColor="#ff747674" android:angle="270" /> </shape> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#80ffd300" android:centerColor="#80ffb600" android:centerY="0.75" android:endColor="#a0ffcb00" android:angle="270" /> </shape> </clip> </item> <item android:id="@android:id/progress" > <clip> <shape> <corners android:radius="5dip" /> <gradient android:startColor="#FF3030" android:endColor="#AEEEEE" android:angle="270" /> </shape> </clip> </item> </layer-list>
2.定义对应的不布局文件:progressbar.xml在此文件中引用我们定义的drawable资源配置文件<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <ProgressBar android:id="@+id/color_progressBar" android:indeterminateDrawable="@drawable/color_progress" android:layout_height="wrap_content" android:layout_width="match_parent"/> </LinearLayout>
或者在代码中给进度条设置自定义资源文件:
效果如下:
四:自定义progressbar颜色:
1.定义一个图片资源文件:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360" > <shape android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="8" android:useLevel="false" > <gradient android:centerColor="#FFFFFF" android:centerY="0.50" android:endColor="#FFFF00" android:startColor="#000000" android:type="sweep" android:useLevel="false" /> </shape> </rotate>
2.定义布局文件:<ProgressBar android:id="@+id/color_progressBar2" android:indeterminateDrawable="@drawable/color_progress2" android:layout_height="wrap_content" android:layout_width="wrap_content"/>
3.效果: -
android 控件之ProgressBar实现双进度条(通常用于流媒体的缓冲区进度)
2015-03-04 16:50:25下面详细介绍ProgressBar ... 在某些操作的进度中的可视指示器,为用户...在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。 二、XML重要属性 android:progress下面详细介绍ProgressBar
一、说明
在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。
二、XML重要属性
android:progressBarStyle:默认进度条样式
android:progressBarStyleHorizontal:水平样式
三、重要方法
getMax():返回这个进度条的范围的上限
getProgress():返回进度
getSecondaryProgress():返回次要进度
incrementProgressBy(int diff):指定增加的进度
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
四、重要事件onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件
五、实例
1.布局文件:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <ProgressBar android:id="@+id/progress_horizontal" style="?android:attr/progressBarStyleHorizontal" android:layout_width="200dip" android:layout_height="wrap_content" android:max="100" android:progress="50" android:secondaryProgress="75" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="默认进度条" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/decrease" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="减少" /> <Button android:id="@+id/increase" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="增加" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定义进度条" /> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/decrease_secondary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第二减少" /> <Button android:id="@+id/increase_secondary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="第二增加" /> </LinearLayout> </LinearLayout>
Activity中的使用:
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.ProgressBar; public class MainActivity extends Activity { /* (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.activity_main); setProgressBarVisibility(true); final ProgressBar progressHorizontal = (ProgressBar) findViewById(R.id.progress_horizontal); setProgress(progressHorizontal.getProgress() * 100); setSecondaryProgress(progressHorizontal.getSecondaryProgress() * 100); Button button = (Button) findViewById(R.id.increase); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { progressHorizontal.incrementProgressBy(1); // Title progress is in range 0..10000 setProgress(100 * progressHorizontal.getProgress()); } }); button = (Button) findViewById(R.id.decrease); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { progressHorizontal.incrementProgressBy(-1); // Title progress is in range 0..10000 setProgress(100 * progressHorizontal.getProgress()); } }); button = (Button) findViewById(R.id.increase_secondary); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { progressHorizontal.incrementSecondaryProgressBy(1); // Title progress is in range 0..10000 setSecondaryProgress(100 * progressHorizontal.getSecondaryProgress()); } }); button = (Button) findViewById(R.id.decrease_secondary); button.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { progressHorizontal.incrementSecondaryProgressBy(-1); // Title progress is in range 0..10000 setSecondaryProgress(100 * progressHorizontal.getSecondaryProgress()); } }); } }
-
【5年Android从零复盘系列之十三】Android自定义View(8):绘制动画详解(图文)
2021-01-15 10:58:03而后设置动画对象时,value每次变化时,调用postInvalidate()通知视图重绘,从而再次调用onDraw()…如此循环,从而实现绘制动画。 2.使用 实际使用效果: 2.1代码解释 2.1.1 动画控制 private int animProgress = ...1.简述
自定义view绘制动画原理就是,定义一个value值,值随着动画进度改变而改变;在onDraw()中,绘制时使其中某个或多个参数值*value/100(假设设置动画进度最大值100);而后设置动画对象时,value每次变化时,调用postInvalidate()通知视图重绘,从而再次调用onDraw()…如此循环,从而实现绘制动画。
2.使用
实际使用效果:
2.1代码解释
2.1.1 动画控制
private int animProgress = 0;//定义一个 跟随动画进度变化的value值 private ValueAnimator mAnimtor ; public void startAnim(){ if (mAnimtor == null){ mAnimtor = ValueAnimator.ofInt(0,100); mAnimtor.setDuration(800);//动画持续时长 mAnimtor.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { animProgress = (int) valueAnimator.getAnimatedValue(); postInvalidate(); } }); } mAnimtor.start(); }
2.1.2初始化绘制
private Paint mPaint; private Path mPath; public DiyViewAnim(Context context) { super(context); mPaint = new Paint(); mPath = new Path(); } public DiyViewAnim(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPath = new Path(); }
2.1.3根据value值动态绘制
其中条形图绘制数值意义可参考自定义view(4):自绘式
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.reset(); mPath.reset(); //1.画坐标轴 mPaint.setColor(Color.parseColor("#404040")); mPaint.setStyle(Paint.Style.STROKE); mPath.moveTo(120, 120);//y轴顶点(120,120) mPath.rLineTo(0, 600);//y轴方向 mPath.rLineTo(800, 0);//x轴方向 canvas.drawPath(mPath, mPaint);//绘制 //2.画x轴label mPaint.reset(); mPaint.setColor(Color.parseColor("#404040")); mPaint.setTextSize(18);//px mPaint.setStyle(Paint.Style.FILL); //假数据 canvas.drawText("1月", 120 + 20, 120 + 600 + 28, mPaint); canvas.drawText("2月", 120 + 20 * 2 + 60 * (2 - 1), 600 + 120 + 28, mPaint); canvas.drawText("3月", 120 + 20 * 3 + 60 * (3 - 1), 600 + 120 + 28, mPaint); //3.画条形图 float[] lines = { 120 + 20 * (1) + 60 * ((1) - 1 + 0.5f), 600 + 120, 120 + 20 * (1) + 60 * ((1) - 1 + 0.5f), 600 + 120 - 180*animProgress/100, 120 + 20 * (2) + 60 * ((2) - 1 + 0.5f), 600 + 120, 120 + 20 * (2) + 60 * ((2) - 1 + 0.5f), 600 + 120 - 420*animProgress/100, 120 + 20 * (3) + 60 * ((3) - 1 + 0.5f), 600 + 120, 120 + 20 * (3) + 60 * ((3) - 1 + 0.5f), 600 + 120 - 140*animProgress/100 }; mPaint.reset(); mPaint.setColor(Color.parseColor("#6ce4d8")); mPaint.setStrokeWidth(60); canvas.drawLines(lines, mPaint); }
2.2 xml使用
<com.cupster.base_super_resource.DiyViewAnim android:id="@+id/diy_chart" android:layout_width="match_parent" android:layout_height="wrap_content" />
DiyViewAnim diyChart = findViewById(R.id.diy_chart); diyChart.startAnim();
3.完整View代码
package com.cupster.base_super_resource; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.Log; import android.view.View; import androidx.annotation.Nullable; public class DiyViewAnim extends View { public DiyViewAnim(Context context) { super(context); mPaint = new Paint(); mPath = new Path(); } public DiyViewAnim(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPath = new Path(); } public DiyViewAnim(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mPath = new Path(); } public DiyViewAnim(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mPaint = new Paint(); mPath = new Path(); } private Paint mPaint; private Path mPath; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.reset(); mPath.reset(); //1.画坐标轴 mPaint.setColor(Color.parseColor("#404040")); mPaint.setStyle(Paint.Style.STROKE); mPath.moveTo(120, 120);//y轴顶点(120,120) mPath.rLineTo(0, 600);//y轴方向 mPath.rLineTo(800, 0);//x轴方向 canvas.drawPath(mPath, mPaint);//绘制 //2.画x轴label mPaint.reset(); mPaint.setColor(Color.parseColor("#404040")); mPaint.setTextSize(18);//px mPaint.setStyle(Paint.Style.FILL); //假数据 canvas.drawText("1月", 120 + 20, 120 + 600 + 28, mPaint); canvas.drawText("2月", 120 + 20 * 2 + 60 * (2 - 1), 600 + 120 + 28, mPaint); canvas.drawText("3月", 120 + 20 * 3 + 60 * (3 - 1), 600 + 120 + 28, mPaint); //3.画条形图 float[] lines = { 120 + 20 * (1) + 60 * ((1) - 1 + 0.5f), 600 + 120, 120 + 20 * (1) + 60 * ((1) - 1 + 0.5f), 600 + 120 - 180*animProgress/100, 120 + 20 * (2) + 60 * ((2) - 1 + 0.5f), 600 + 120, 120 + 20 * (2) + 60 * ((2) - 1 + 0.5f), 600 + 120 - 420*animProgress/100, 120 + 20 * (3) + 60 * ((3) - 1 + 0.5f), 600 + 120, 120 + 20 * (3) + 60 * ((3) - 1 + 0.5f), 600 + 120 - 140*animProgress/100 }; mPaint.reset(); mPaint.setColor(Color.parseColor("#6ce4d8")); mPaint.setStrokeWidth(60); canvas.drawLines(lines, mPaint); } private int animProgress = 0; private ValueAnimator mAnimtor ; public void startAnim(){ if (mAnimtor == null){ mAnimtor = ValueAnimator.ofInt(0,100); mAnimtor.setDuration(800); mAnimtor.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { animProgress = (int) valueAnimator.getAnimatedValue(); postInvalidate(); } }); } mAnimtor.start(); } }
-
Android ProgressBar 的使用
2021-01-30 17:38:26Android ProgressBar 分为水平进度条和圆形进度条, 看官方的划分是Indeterminate ...不确定模式是进度条的默认模式,它显示循环动画,但未指示特定的进度 这也就是官方的圆形进度条一直在旋转的原因吧 Determinate .. -
Android ProgressBar
2017-06-07 21:32:21ProgressBar是Android的进度条. 一、说明 在某些操作的进度中的...在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。 二、XML重要属性 android:progressBarSt -
android 进度条 java_Android 控件之ProgressBar进度条
2021-03-22 08:33:22ProgressBar是Android的进度条。体验效果 下面详细介绍ProgressBar一、说明在某些...在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。二、XML重要属性android:progressBarStyl... -
Android ProgressBar详解
2018-05-16 09:59:10android:indeterminate是否允许使用不确定模式,在不确定模式下,进度条动画无限循环android:indeterminateBehavior定义当进度达到最大时,不确定模式的表现;该值必须为repeat或者cycle,repeat表示进度从0重新开..... -
Android中ProgressBar进度条
2014-07-16 16:09:19在某项延续性工作的进展过程中为了不让用户觉得程序失去响应,需要有个活动的进度条,表示此过程正在进行中,...在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。 XML重要属性与 -
Android progressbar 详解
2016-06-28 12:33:00[原文Android学习笔记(十六)进度条]ProgressBarXML属性...android:indeterminate是否允许使用不确定模式,在不确定模式下,进度条动画无限循环android:indeterminateBehavior定义当进度达到最大时,不确定模式的表... -
android基础进度条原理
2017-11-27 11:32:00下面详细介绍ProgressBar 一、说明 在某些操作的进度中的可视指示器,为用户...在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。 二、XML重要属性 android:progressBar... -
android 自定义ProgressBar
2014-02-12 15:29:49在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中 1、android.widget. ProgressBar,... -
Android 控件之ProgressBar进度条
2014-04-10 14:17:00Android 控件之ProgressBar进度条 ProgressBar是Android的进度条。体验效果 ... 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,...在不确定模式下,进度条显示循环动画。这... -
Android之进度条的使用
2013-04-06 02:00:471.默认进度条,这种模式,进度条循环显示动画,这种进度条一般应用于执行的任务的长度不确定。XML属性:android:progressBarStyle。 2.水平进度条,可以呈现操作的进度,它还有一个第二进度条(次要进度条)用来... -
环形动画加载视图AnimatedCircleLoadingView
2018-06-01 13:50:30环形动画加载视图...该视图采用循环的环形动画显示加载进度。同时,开发者可以设置在视图中心位置是否显示加载百分比。根据加载是否成功,提供加载成功和失败两种显示结果。 ... -
Android 开发技巧
2012-03-26 10:24:426、ANDROID UI 动画 160 6.1、四种2D动画 160 6.1.1、透明度控制动画效果 alpha 160 6.1.2、旋转动画效果 rotate 161 6.1.3、尺寸伸缩动画效果 scale 162 6.1.4、位置转移动画效果 translate 163 6.1.5、四种动画... -
Android常见控件之ProgressBar
2011-04-09 17:13:00在不确定模式下,进度条显示循环动画。如果不设置进度条的样式,默认是不确定进度样式,画面不会随着进度的不同而变化。 ProgressBar的样式有以下四种: android:progressBarStyle:默认进度条样式,不确定模式 ... -
赵雅智_android多线程下载带进度条
2017-04-11 21:47:00progressBar说明 在某些操作的进度中的...在不确定模式下,进度条显示循环动画。这样的模式经常使用于应用程序使用任务的长度是未知的。 XML重要属性 android:progressBarStyle:默认进度条样式 android:prog...