真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android實(shí)現(xiàn)輕量線性與百分比圖表的方法-創(chuàng)新互聯(lián)

前言

成都創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、法庫(kù)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為法庫(kù)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

經(jīng)常要用到圖表統(tǒng)計(jì)數(shù)據(jù),在WEB開發(fā)中圖表繪制是一件簡(jiǎn)單的事情,因?yàn)橛斜容^多的開源方案。但在Android中開源方案并不多。但目前github上有多個(gè)關(guān)于圖表的框架,比如MPAndroidChart很好,但是很大,沒必要因?yàn)橐粋€(gè)小的圖標(biāo)讓工程項(xiàng)目擴(kuò)大很多,另外有些輕量級(jí)的框架,但是個(gè)人感覺都很難滿足自己的需求,再者就算很好的框架,那也是別人的,只有自己動(dòng)手寫起來,了解前前后后的坑,自己才能成長(zhǎng),而且在寫的過程,我們能發(fā)現(xiàn)更多的細(xì)節(jié),比如繪制的時(shí)候內(nèi)存分配的問題,Canvas直接繪制和通過Bitmap繪制等等,所以這篇文章的目的:

      1.是給大家提供自定義view繪制的思路


      2.滑動(dòng)自定義view的部分區(qū)域怎么實(shí)現(xiàn)


      3.path動(dòng)畫繪制的實(shí)現(xiàn)


      4.熟悉canvas的api,總之能直接動(dòng)手了,那就自定義view就通關(guān)了,所以就寫這篇文章主要是鼓勵(lì)大家多去實(shí)現(xiàn)。


效果圖


線性圖表實(shí)現(xiàn)的思路:

線性表是最基本、最簡(jiǎn)單、也是最常用的一種數(shù)據(jù)結(jié)構(gòu)。線性表中數(shù)據(jù)元素之間的關(guān)系是一對(duì)一的關(guān)系,即除了第一個(gè)和最后一個(gè)數(shù)據(jù)元素之外,其它數(shù)據(jù)元素都是首尾相接的,注意,這句話只適用大部分線性表,而不是全部。

由于屏幕的寬度有限,所以我們一屏經(jīng)過計(jì)算,最好顯示的7個(gè)點(diǎn),所以我們首先需要對(duì)我們的view寬度進(jìn)行計(jì)算,首先拿到屏幕的寬度,然后再進(jìn)行/7,得到每個(gè)間隔的寬度,然后乘以我們x的坐標(biāo)點(diǎn)的個(gè)數(shù),其中的onMeasure的方法:

 int widthParentMeasureMode = MeasureSpec.getMode(widthMeasureSpec);
 int widthParentMeasureSize = MeasureSpec.getSize(widthMeasureSpec);
 int heightParentMeasureMode = MeasureSpec.getMode(heightMeasureSpec);
 int heightParentMeasureSize = MeasureSpec.getSize(heightMeasureSpec);
 int resultWidthSize = 0;
 int resultHeightSize = 0;
 int resultWidthMode = MeasureSpec.EXACTLY;//用來對(duì)childView進(jìn)行計(jì)算的
 int resultHeightMode = MeasureSpec.EXACTLY;
 int paddingWidth = getPaddingLeft() + getPaddingRight();
 int paddingHeight = getPaddingTop() + getPaddingBottom();
 ViewGroup.LayoutParams thisLp = getLayoutParams();
 switch (widthParentMeasureMode) {
  //父類不加限制給子類
  case MeasureSpec.UNSPECIFIED:
   //這個(gè)代表在布局寫死了寬度
   if (thisLp.width > 0) {
    resultWidthSize = thisLp.width;
    resultWidthMode = MeasureSpec.EXACTLY;
   } else {
    resultWidthSize = (int) (getYMaxTextWidth() + mXinterval * mXdots.length);
    resultWidthMode = MeasureSpec.UNSPECIFIED;
   }
   break;
  case MeasureSpec.AT_MOST:
   //這個(gè)代表在布局寫死了寬度
   if (thisLp.width > 0) {
    resultWidthSize = thisLp.width;
    resultWidthMode = MeasureSpec.EXACTLY;
   } else if (thisLp.width == ViewGroup.LayoutParams.MATCH_PARENT) {
    resultWidthSize = Math.max(0, widthParentMeasureSize - paddingWidth);
    resultWidthMode = MeasureSpec.AT_MOST;
   } else if (thisLp.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
    resultWidthSize = (int) (getYMaxTextWidth() + mXinterval * mXdots.length);
    resultWidthMode = MeasureSpec.AT_MOST;
   }
   break;
  case MeasureSpec.EXACTLY:
   //這個(gè)代表在布局寫死了寬度
   if (thisLp.width > 0) {
    resultWidthSize = Math.min(widthParentMeasureSize, thisLp.width);
    resultWidthMode = MeasureSpec.EXACTLY;
   } else if (thisLp.width == ViewGroup.LayoutParams.MATCH_PARENT) {
    resultWidthSize = widthParentMeasureSize;
    resultWidthMode = MeasureSpec.EXACTLY;
   } else if (thisLp.width == ViewGroup.LayoutParams.WRAP_CONTENT) {
    resultWidthSize = (int) (getYMaxTextWidth() + mXinterval * mXdots.length);
    resultWidthMode = MeasureSpec.AT_MOST;
   }
   break;
 }

本文標(biāo)題:Android實(shí)現(xiàn)輕量線性與百分比圖表的方法-創(chuàng)新互聯(lián)
文章地址:http://weahome.cn/article/dossjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部