欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

一個(gè)簡(jiǎn)單的Android軌跡動(dòng)畫(huà)

本文實(shí)例為大家分享了Android軌跡動(dòng)畫(huà)的具體代碼,供大家參考,具體內(nèi)容如下

員工經(jīng)過(guò)長(zhǎng)期磨合與沉淀,具備了協(xié)作精神,得以通過(guò)團(tuán)隊(duì)的力量開(kāi)發(fā)出優(yōu)質(zhì)的產(chǎn)品。成都創(chuàng)新互聯(lián)堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡(jiǎn)單”。公司專注于為企業(yè)提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、電商網(wǎng)站開(kāi)發(fā),成都小程序開(kāi)發(fā),軟件按需求定制開(kāi)發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。

二、需求描述

年中那會(huì)兒基友的公司給他了一張只有一條曲線的圖,想讓他按照曲線的軌跡動(dòng)態(tài)展示整個(gè)曲線,然而基友忙于把妹,一個(gè)饅頭的代價(jià)收買了我,于是幫他寫(xiě)了代碼。先看下實(shí)現(xiàn)效果                     

一個(gè)簡(jiǎn)單的Android軌跡動(dòng)畫(huà)

上原始圖(原始圖的軌跡曲線是白色的,其他部分是透明的,這里為了便于觀察,我將背景調(diào)為黑色)

一個(gè)簡(jiǎn)單的Android軌跡動(dòng)畫(huà)

三、分析實(shí)現(xiàn)

        講道理,剛拿到這個(gè)圖片的時(shí)候我也有點(diǎn)懵逼,一個(gè)毫無(wú)規(guī)律的曲線很顯然不能通過(guò)簡(jiǎn)單的方程式去描述點(diǎn)的具體位置,甚至想說(shuō)設(shè)計(jì)直接給個(gè)動(dòng)畫(huà)豈不美滋滋...... 

        吐槽歸吐槽,需求還是要實(shí)現(xiàn)的,而且這個(gè)需求是有不少常見(jiàn)的方法可以進(jìn)行實(shí)現(xiàn)的,比如上下兩層圖片保持一直,上層不斷從左到右將原圖縱向像素清除,然后將設(shè)計(jì)給的圖片也按照從左到友的順去繪制上去。不過(guò)這種方法的可擴(kuò)展性太差,底層的圖片發(fā)生改變(滑動(dòng)、變色)上層也需要進(jìn)行配合。

        這里使用方法是:將圖片中有色像素在圖片上的位置按照比例映射到要繪制的View中。

        比如,原圖大小是200*100,要去做展示的View的尺寸大小是450*300,某點(diǎn)在原圖中位于x100,y20的位置,那么它在view中的位置應(yīng)該為225,60。也就是說(shuō)將該點(diǎn)在途中的位置比上原圖對(duì)應(yīng)尺寸然后在乘以View的尺寸即可。

        軌跡的獲取可以通過(guò)獲取全部的像素點(diǎn)顏色,因?yàn)橥该鞯谋厝徊皇擒壽E,所以判斷Alpha值即可,又因?yàn)檐壽E是一條線,當(dāng)我們使用Path連點(diǎn)的時(shí)候?yàn)榱吮M量減少不必要點(diǎn)的連接,我這里通過(guò)平均值的方式將曲線的寬度降為1。

        由于點(diǎn)的位置是按照尺寸比例計(jì)算的,所以無(wú)論要展示的圖片尺寸有多奇葩,都可以完美適配上去        

四、實(shí)現(xiàn)代碼

public class TestView extends View implements ViewTreeObserver.OnGlobalLayoutListener{
 private Paint paint = new Paint();
 private Bitmap bitmap;
 private int[]local;
 boolean enter = false;
 int count;
 ViewTreeObserver observer;
 Canvas canvas;
 float lastX = 0;
 float lastY = 0;
 
 public TestView(Context context) {
  super(context);
 }
 
 public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  observer = this.getViewTreeObserver();
  observer.addOnGlobalLayoutListener(this);
  getImageFromAssetsFile("target.png");//讀取圖片
 }
 
 public TestView(Context context, AttributeSet attrs) {
  super(context, attrs);
  observer = this.getViewTreeObserver();
  observer.addOnGlobalLayoutListener(this);
  getImageFromAssetsFile("target.png");
 }
 
 private void getImageFromAssetsFile(String fileName) {
  AssetManager am = getResources().getAssets();
  try {
   InputStream is = am.open(fileName);
   bitmap = BitmapFactory.decodeStream(is);
   is.close();
  }
  catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 
 private void filterColor(){
  int w = bitmap.getWidth();
  int h = bitmap.getHeight();
  int[]pixels = new int[w*h];
  local = new int[w];//以原圖寬為單位,保存點(diǎn)在原圖Y軸上的位置
  bitmap.getPixels(pixels,0,bitmap.getWidth(),0,0,bitmap.getWidth(),bitmap.getHeight());
  for(int i = 0; i < w; i++){
   int lenght = 0;
   int total = 0;
   for(int j = 0;j<h;j++){
     if (bitmap.getPixel(i, j) !=0) {
      lenght++;
      total+=j;
     }
   }
 
   System.out.println(lenght+"");
   if(lenght<15||((float)i/(float) w)<0.85)
    local[i] = total/lenght;
   else
     break;
  }
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  if(enter) {
   paint.setAntiAlias(true);      //設(shè)置畫(huà)筆為無(wú)鋸齒
   paint.setColor(Color.WHITE);     //設(shè)置畫(huà)筆顏色
   canvas.drawColor(Color.TRANSPARENT);     //透明背景
   paint.setStrokeWidth((float) 6.0);    //線寬
   paint.setStyle(Paint.Style.STROKE);
 
   Path path = new Path();
   path.moveTo(0, (((float) getMeasuredHeight()-25) / (float)bitmap.getHeight()) * (float) local[0]+7);
   if (count <= bitmap.getWidth()) {
    if(count<bitmap.getWidth())
     count++;
    for (int i = 1; i < count - 1; i++) {
     if(local[i]>0) {
      path.lineTo((getMeasuredWidth() / (float) bitmap.getWidth()) * (float) i, (((float) getMeasuredHeight()-25) / (float) bitmap.getHeight()) * (float) local[i]+7);
      lastX = (getMeasuredWidth() / (float) bitmap.getWidth()) * (float) i;
      lastY = (((float) getMeasuredHeight()-25 )/ (float) bitmap.getHeight()) * (float) local[i];
     }
    }
   }
   if(count<bitmap.getWidth())
    postInvalidate();
   else {
    count = 0;
    postInvalidate();
   }
    canvas.drawPath(path, paint);
    paint.setStyle(Paint.Style.FILL);
    canvas.drawCircle(lastX, lastY+7, 7, paint);
//   }
  }else{
   this.canvas = canvas;
  }
 }
 
 @Override
 public void onGlobalLayout() {
  filterColor();
  enter = true;
  postInvalidate();
 }
}

當(dāng)然了,這個(gè)代碼也只是給基友交差用的,還有不少地方能做優(yōu)化,比如:將圖片讀取放在子線程、對(duì)圖片大小進(jìn)行判斷避免OOM、大圖加載圖片壓縮。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)站欄目:一個(gè)簡(jiǎn)單的Android軌跡動(dòng)畫(huà)
本文鏈接:http://aaarwkj.com/article24/gdscje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站設(shè)計(jì)、網(wǎng)站收錄網(wǎng)頁(yè)設(shè)計(jì)公司域名注冊(cè)、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
久久精品人妻少妇一区二区| 丰满人妻少妇精品一区二区三区| 伊人久久精品一区二区| 久久婷婷av一区二区三区| 高清偷自拍亚洲精品三区| 久久视频在线播放视频| 精品国产综合一区二区三区| 男女午夜激情四射视频| 99国产精品热久久婷婷| 中国一级黄片免费欧美| 中文字幕丰满人妻不满中出片| 亚洲丰满毛茸茸毛茸茸| av成人综合在线资源站| 国产亚洲一区二区视频| 人妻免费精品久久一区| 美女张开腿让男人插进去| 国产有码日产一区在线观看| 亚洲中文字幕女同系列av专区| 日本亚洲精品一区二区三| 国产精品一区二区精品| 亚洲乱码中文字幕久久| 亚洲美女插入av网络导航| 日本激情精品在线观看| 蜜桃精品国产一区二区三区| 久久久久久97精品| 老熟女露脸吞精一二三四区| 国产三级网站在线观看| 国产精品久久久久精品三级中文国| 亚洲av精二区三区四区| 欧美人妻不卡一区二区久久| 午夜福利精品在线观看| 久久精品熟女亚洲av色| 肥臀大屁股av在线播放| 中文字幕伦理一区二区| 欧美久久久久久久黑人| 91在线视频欧美国产| 成年人片免费在线观看| 国产剧情在线观看网站| 成人色视频免费在线观看| 国产又粗又长又大又长| 国产亚洲欧美精品久久久久久|