中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

如何實現(xiàn)Android軌跡動畫-創(chuàng)新互聯(lián)

這篇文章主要介紹了如何實現(xiàn)Android軌跡動畫,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比鳳翔網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式鳳翔網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋鳳翔地區(qū)。費用合理售后完善,十載實體公司更值得信賴。

具體內(nèi)容如下

二、需求描述

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

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

三、分析實現(xiàn)

講道理,剛拿到這個圖片的時候我也有點懵逼,一個毫無規(guī)律的曲線很顯然不能通過簡單的方程式去描述點的具體位置,甚至想說設計直接給個動畫豈不美滋滋......

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

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

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

軌跡的獲取可以通過獲取全部的像素點顏色,因為透明的必然不是軌跡,所以判斷Alpha值即可,又因為軌跡是一條線,當我們使用Path連點的時候為了盡量減少不必要點的連接,我這里通過平均值的方式將曲線的寬度降為1。

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

四、實現(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];//以原圖寬為單位,保存點在原圖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);      //設置畫筆為無鋸齒   paint.setColor(Color.WHITE);     //設置畫筆顏色   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(); }}

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何實現(xiàn)Android軌跡動畫”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設公司,,關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!

當前文章:如何實現(xiàn)Android軌跡動畫-創(chuàng)新互聯(lián)
鏈接分享:http://www.2m8n56k.cn/article6/pcjog.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器全網(wǎng)營銷推廣企業(yè)建站網(wǎng)站排名網(wǎng)站導航定制網(wǎng)站

廣告

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

網(wǎng)站建設網(wǎng)站維護公司
主站蜘蛛池模板: 精品日韩二区三区精品视频 | 亚洲男人天堂手机版 | 国产爱啪啪 | 欧美日本一二三区 | 一级一片在线播放在线观看 | 一区二区亚洲精品 | 真人一级毛片免费完整视 | 欧美一级毛片无遮无挡 | 久久精品视频播放 | 亚洲自偷| 久草资源福利 | 欧美手机在线视频 | 欧美一区二区在线播放 | 日韩久久精品 | 国产成人香蕉久久久久 | 成人性色生活片免费网 | 黄色毛片a | 一个人看的免费观看日本视频www | 在线a人片免费观看国产 | 成人做爰视频www网站 | 久久久精品一区二区三区 | 成人精品视频在线观看 | 在线日韩欧美一区二区三区 | 亚洲免费大全 | 久久最新 | 一级毛片在线完整免费观看 | 男人天堂视频在线 | 澳门毛片在线播放 | 一色屋精品亚洲香蕉网站 | 毛片免费全部免费播放 | 综合刺激网 | 国产精品aⅴ | 欧美日韩成人 | 一本高清 | 成人国产亚洲欧美成人综合网 | 国产午夜精品一区二区 | 国产毛片久久久久久国产毛片 | 视频一区中文字幕 | 精品国产一区二区三区四区vr | 97国产在线播放 | 好叼操这里只有精品 |