Android Canvas實際操作

2021-09-24 20:32:55 字數 4630 閱讀 1055

本篇我們來看canvas的實際應用,這裡會應用到屬性動畫valueanimator類,下面先看一下具體的效果

上述效果圖中主要由三部分組成,第一,繪製6個小球並旋轉,第二,6個小球先擴充套件然後收縮,第三,水波紋效果,展示一張。

1)旋轉部分

首先,將6個小球分別繪製到螢幕上,呼叫 canvas.drawcircle()方法來繪製小球,根據api的引數,這裡我們需要計算出每個小球的圓心座標,6個小球是在乙個圓內,也就是說將乙個圓均分為了6份,而整個圓是360°,那麼兩小球之間的夾角就是

float rotate = math.pi*2/ballcolor.length 這裡ballcolor是定義的6個小球顏色的陣列int ballcolor,所有小球之間的夾角就是

//計算角度

float rotate = (float) (math.pi * 2 / ballcolor.length);

for (int i = 0; i < ballcolor.length; i++)

角度有了,如何計算出每個小球的圓心座標點呢,我們以一張圖來說明座標的計算

∠abc 就是上面我們計算出的角度值angel ,ab長是圓環的半徑,由我們自己定義,那麼a點的x座標就是math.cos(angel) *radiuscurball(圓環半徑)+centerx,相應的y座標就是math.sin(angel) *radiuscurball+centery ,這裡的centerx和centery 表示畫布的中心點座標,這樣每個小球的圓心座標就有了。

private void drawcirlce(canvas canvas) 

}

小球繪製完畢後,該執行旋轉動畫了,這裡採用valueanimator來執行,每個小球的旋轉角度是從0到360°,呼叫valueanimator.addupdatelistener,獲取到動畫在執行過程中的角度,將該角度傳遞到計算小球角度的邏輯**中,從而完成小球的旋轉

valueanimator = valueanimator.offloat(0f, (float) (math.pi * 2));

valueanimator.setrepeatcount(2);

valueanimator.setduration(rotateduration);

valueanimator.setinterpolator(new linearinterpolator());

valueanimator.addupdatelistener(new valueanimator.animatorupdatelistener()

});animator.start();

rotateangel 就是獲取的實時旋轉角度,修改繪製小球drawcirlce()方法

private void drawcirlce(canvas canvas) 

}

這樣,小球就開始旋轉了。

下面再來看一下第二個過程,擴充套件和聚合。在該動畫中,我們使用到了乙個新的插值器overshootinterpolator,它表示動畫在執行過程中,會向前甩一定的值,然後會回到原來位置,在效果圖中,小球是先向外擴散,然後再聚合,那麼動畫的執行過程就是小球半徑到圓環半徑。

valueanimator = valueanimator.offloat(radiussmball, radiusbigball);

valueanimator.setduration(rotateduration);

valueanimator.setinterpolator(new overshootinterpolator(5f));

valueanimator.addupdatelistener(new valueanimator.animatorupdatelistener()

});valueanimator.reverse();

valueanimator = valueanimator.offloat(radiussmball, mdistane);

valueanimator.setduration(rotateduration);

valueanimator.setinterpolator(new linearinterpolator());

valueanimator.addupdatelistener(new valueanimator.animatorupdatelistener()

});valueanimator.start();

再來看一下繪製水波紋

float strokewidth = mdistane - radiuspole;

float realradius = radiuspole + strokewidth / 2;

paintpole.setstrokewidth(strokewidth);

canvas.drawcircle(centerx, centery, realradius, paintpole);

看一下完整實現

import android.animation.animator;

import android.animation.animatorlisteneradapter;

import android.animation.valueanimator;

import android.content.context;

import android.graphics.canvas;

import android.graphics.color;

import android.graphics.paint;

import android.support.annotation.nullable;

import android.util.attributeset;

import android.util.log;

import android.view.view;

import android.view.animation.linearinterpolator;

import android.view.animation.overshootinterpolator;

public class animview extends view

public animview(context context, @nullable attributeset attrs)

public animview(context context, @nullable attributeset attrs, int defstyleattr)

//動畫效果,1.6個小球轉動,2.6個小球擴散、聚合,3.水波紋效果

private void init(context context)

@override

protected void ondraw(canvas canvas)

state.drawstate(canvas);

}@override

protected void onsizechanged(int w, int h, int oldw, int oldh)

/*** 旋轉

*/private class turnstate extends splashstate

});valueanimator.addlistener(new animatorlisteneradapter()

});valueanimator.start();

}@override

void drawstate(canvas canvas)

}/**

* 擴散、收縮

*/private class mergestate extends splashstate

});valueanimator.addlistener(new animatorlisteneradapter()

});valueanimator.reverse();

}@override

void drawstate(canvas canvas)

}/**

* 水波紋

*/private class polestate extends splashstate

});valueanimator.start();

}@override

void drawstate(canvas canvas)

}private void drawbackground(canvas canvas) else

}private void drawcirlce(canvas canvas)

}abstract class splashstate

}

以及xml布局

<?xml version="1.0" encoding="utf-8"?>

Android Canvas清屏失效

自定義控制項時經常用到canvas,畫新的東西之前需要先清除畫布內容,人臉識別專案中需要準確畫出當前人臉位置,清空上一幀位置。關於清除畫布內容網上有兩種非常流行的方法 方法一 mcanvas.drawcolor color.transparent,porterduff.mode.clear 方法二 ...

Android canvas 監聽繪製電池電量

1 簡介 使用canvas 根據電池電量變化 繪製電池圖示 1 充電 顯示綠色 2 電量低於10 使用 紅色 3 其餘白色 2 自定義 batteryview override 設定 view 大小 protected void onmeasure int widthmeasurespec,int ...

Android Canvas繪製七巧板

心血來潮,封裝了乙個繪製彩色多邊形的方法,並用這個方法繪製了乙個七巧板 感覺繪製華容道太簡單了 如下 public class canvaspuzzle extends view public canvaspuzzle context context,attributeset attrs publi...