Android自定義view實(shí)現(xiàn)動(dòng)態(tài)柱狀圖
先看一下動(dòng)態(tài)柱狀圖效果。
主要功能是可以自定義指定的字體,柱狀圖顏色,動(dòng)態(tài)效果。
在自定義view
public class Histogram extends View { int MAX = 100;//矩形顯示的最大值 int corner = 0; //矩形的角度。 設(shè)置為0 則沒有角度。 double data = 0.0;//顯示的數(shù) double tempData = 0; //初始數(shù)據(jù) int textPadding = 50; //字體與矩形圖的距離 Paint mPaint; int mColor; Context mContext; //構(gòu)造函數(shù) public Histogram(Context context) { super(context); mContext = context; } public Histogram(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mContext = context; initPaint(); } public Histogram(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; initPaint(); } //畫筆方法 private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mColor = mContext.getResources().getColor(R.color.gary); mPaint.setColor(mColor); } @Override public void draw(Canvas canvas) { super.draw(canvas); if (data == 0.0) { mPaint.setTextSize(getWidth() / 2); RectF oval3 = new RectF(0, getHeight() - DensityUtils.pxTodip(mContext, 20), getWidth(), getHeight());// 設(shè)置個(gè)新的長(zhǎng)方形 canvas.drawRoundRect(oval3, DensityUtils.pxTodip(mContext, corner), DensityUtils.pxTodip(mContext, corner), mPaint); canvas.drawText("0", getWidth() * 0.5f - mPaint.measureText("0") * 0.5f, getHeight() - DensityUtils.pxTodip(mContext, 20) - 2 * DensityUtils.pxTodip(mContext, textPadding), mPaint); return; } //防止數(shù)值很大的的時(shí)候,動(dòng)畫時(shí)間過長(zhǎng) int step = (int) (data / 100 + 1.0); if (tempData < data - step) { tempData = tempData + step; } else { tempData = data; } //畫圓角矩形 String S = tempData + ""; //如果數(shù)字后面需要加% 則在""中添加% //設(shè)置顯示的字體 Typeface typeface = Typeface.createFromAsset(getContext().getAssets(),"digital-7.ttf"); mPaint.setTypeface(typeface); // //一個(gè)字和兩,三個(gè)字的字號(hào)相同 if (S.length() < 4) { mPaint.setTextSize(getWidth()/2 ); } else { mPaint.setTextSize(50); //可以通過getWidth()/2 改變字體大小 也可以通過設(shè)置數(shù)字來改變自己想要的字體大小 當(dāng)超出矩形圖寬度時(shí)不能顯示全部 } // float textH = mPaint.ascent() + mPaint.descent(); float MaxH = getHeight() - textH - 2 * DensityUtils.pxTodip(mContext, textPadding); // //圓角矩形的實(shí)際高度 float realH = (float) (MaxH / MAX * tempData); RectF oval3 = new RectF(0, getHeight() - realH, getWidth(), getHeight());// 設(shè)置個(gè)新的長(zhǎng)方形 canvas.drawRoundRect(oval3, DensityUtils.pxTodip(mContext, corner), DensityUtils.pxTodip(mContext, corner), mPaint); //寫數(shù)字 canvas.drawText(S, getWidth() * 0.5f - mPaint.measureText(S) * 0.5f, getHeight() - realH - 2 * DensityUtils.pxTodip(mContext, textPadding), mPaint); if (tempData != data) { postInvalidate(); } } public void setData(double data, int MAX) { this.data = data; this.MAX = MAX; postInvalidate(); } public int getmColor() { return mColor; } public void setmColor(int mColor) { this.mColor = mColor; } }
布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" > <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.2"/> <com.mieasy.myhistogramview.Histogram android:id="@+id/column_one" android:layout_width="0dp" android:layout_height="300dp" android:layout_weight="0.8"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2.4"/> <com.mieasy.myhistogramview.Histogram android:id="@+id/column_two" android:layout_width="0dp" android:layout_height="300dp" android:layout_weight="1"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2.4"/> <com.mieasy.myhistogramview.Histogram android:id="@+id/column_three" android:layout_width="0dp" android:layout_height="300dp" android:layout_weight="1"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="0.2"/> </LinearLayout>
MainActivity調(diào)用initAllViews()方法
private void initAllViews() { column_one = (Histogram) findViewById(R.id.column_one); column_two = (Histogram) findViewById(R.id.column_two); column_three = (Histogram) findViewById(R.id.column_three); column_one.setData( 20.22, 100); column_two.setData(30.2, 100); column_three.setData(40, 100); column_one.mPaint.setColor(getResources().getColor(R.color.colorAccent)); //改變柱狀圖的顏色 }
參考文章:100行Android代碼輕松實(shí)現(xiàn)帶動(dòng)畫柱狀圖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
快速解決fragment中onActivityResult不調(diào)用的問題
下面小編就為大家?guī)硪黄焖俳鉀Qfragment中onActivityResult不調(diào)用的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Android 自定義底部上拉控件的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Android 自定義底部上拉控件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android使用Item Swipemenulistview實(shí)現(xiàn)仿QQ側(cè)滑刪除功能
大家都用過QQ,肯定有人好奇QQ滑動(dòng)刪除Item的效果是怎樣實(shí)現(xiàn)的,其實(shí)我們使用Swipemenulistview就可以簡(jiǎn)單的實(shí)現(xiàn)。這篇文章主要介紹了Android使用ItemSwipemenulistview實(shí)現(xiàn)仿QQ側(cè)滑刪除功能,需要的朋友可以參考下2017-02-02基于Flutter實(shí)現(xiàn)手勢(shì)密碼加密與解鎖功能
這篇文章主要介紹了如何利用Flutter實(shí)現(xiàn)手勢(shì)密碼的加密與解鎖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android 讓自定義TextView的drawableLeft與文本一起居中
本文主要介紹Android 自定義控件TextView顯示居中問題,在開發(fā)過程中經(jīng)常會(huì)遇到控件的重寫,這里主要介紹TextView的drawableLeft與文本一起居中的問題2016-07-07