androidcanvas繪制
1. 如何用android 畫出三角形
。支支吾吾也沒說出來,哎,回家一想太可氣 了,就找到方法。原來是android.graphics.Path這個類,實現的。Api里的描述如下:The Path class encapsulates compound (multiple contour) geometric paths consisting of straight line segments, quadratic curves, and cubic curves. It can be drawn with canvas.drawPath(path, paint), either filled or stroked (based on the paint's Style), or it can be used for clipping or to draw text on a path. 它大概的意思是說path類包含了多種組件,比如直線段,二次曲線,三次曲線,它可以在畫布上繪制,無論是填充或筆畫。下面舉例說明: package cn.lgl.draw; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.Shader; import android.view.View; public class MyView extends View { public MyView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); /*設置背景為白色*/ canvas.drawColor(Color.WHITE); Paint paint=new Paint(); /*去鋸齒*/ paint.setAntiAlias(true); /*設置paint的顏色*/ paint.setColor(Color.RED); /*設置paint的 style 為STROKE:空心*/ paint.setStyle(Paint.Style.STROKE); /*設置paint的外框寬度*/ paint.setStrokeWidth(3); /*畫一個空心三角形*/ Path path=new Path(); path.moveTo(10,330); path.lineTo(70,330); path.lineTo(40,100); path.close(); canvas.drawPath(path, paint); /*設置paint 的style為 FILL:實心*/ paint.setStyle(Paint.Style.FILL); /*設置paint的顏色*/ paint.setColor(Color.BLUE); /*畫一個實心三角形*/ Path path2=new Path(); path2.moveTo(90,330); path2.lineTo(150,330); path2.lineTo(120,270); path2.close(); canvas.drawPath(path2, paint); Shader mShader=new LinearGradient(0,0,100,100, new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW}, null,Shader.TileMode.REPEAT); paint.setShader(mShader); /*畫一個漸變色三角形*/ Path path4=new Path(); path4.moveTo(170,330); path4.lineTo(230,330); path4.lineTo(200,270); path4.close(); canvas.drawPath(path4,paint); } }
2. android:如何用canvas在自定義view里畫圖
將構造函數改成這個試試
public iniView01(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
本人在寫的時候也遇到過代碼沒問題,但是一到虛擬機裡面運行就崩了,然後將構造函數改成這個就不會了
3. Android繪圖之Canvas變換(6)
前面講解了Canvas的基本概念, Android繪圖之Canvas概念理解(5) ,
對Canvas的概念進行了分析,但是沒有說明和屏幕的關系,Canvas不等於屏幕,屏幕不會動的,我們也無法對屏幕進行(平移,縮放等)操作,只能對Canvas進行操作,所以對Canvas進行操作,屏幕不動,最終會導致看到的圖像不同。
下面開始講解Canvas的變幻操作:
包括:translate,rotate,scale,skew,clip,clipout,matrix
先從最簡單的平移開始:
對Canvas進行平移,
dx: x軸方向進行平移,正值向屏幕右側
dy:y軸方向進行平移,正值向屏幕下方
繪制兩個點查看原點位置。
原點顯然改變了,以後再繪制任何形狀都是以translate後的原點開始繪制。
參數說明
sx:橫向的縮放,默認為1,小數縮小,整數放大
sy:縱向的縮放,默認為1,小數縮小,整數放大
px,py,看源碼知道是先translate,執行sx,sy然後再translate反方向。
第二次translate的坐標為(-px sx,-px sy),最終的效果就是px,py是縮放後不動的點。
縮放後坐標減半。
如果想控制縮放後的位置,如何控制呢,這就需要第二個函數。
還可以控制其他位置,例如控制縮放後在中心。
rotate有兩個函數:
rotate(float degrees)
rotate(float degrees, float px, float py)
Degree:旋轉的角度,正值為順時針,負值為逆時針
Px,py:旋轉的中心,如果不指定旋轉中心默認為(0,0)點
指定旋轉中心為矩形中心
參數說明:
sx:畫布在x方向上傾斜相應的角度,sx傾斜角度的tan值,
sy:畫布在y軸方向上傾斜相應的角度,sy為傾斜角度的tan值,
根據矩形或者路徑裁剪畫布,畫布被切割之後,只有部分區域可用,其他區域無法繪制內容。
Clip函數切割的區域可用,clipOut未被切割的區域可用。(過時函數不再講解)
Matrix提供了一些方法來控制變換:
android繪圖之Paint(1)
android繪圖之Canvas基礎(2)
Android繪圖之Path(3)
Android繪圖之drawText繪制文本相關(4)
Android繪圖之Canvas概念理解(5)
Android繪圖之Canvas變換(6)
Android繪圖之Canvas狀態保存和恢復(7)
Android繪圖之PathEffect (8)
Android繪圖之LinearGradient線性漸變(9)
Android繪圖之SweepGradient(10)
Android繪圖之RadialGradient 放射漸變(11)
Android繪制之BitmapShader(12)
Android繪圖之ComposeShader,PorterDuff.mode及Xfermode(13)
Android繪圖之drawText,getTextBounds,measureText,FontMetrics,基線(14)
Android繪圖之貝塞爾曲線簡介(15)
Android繪圖之PathMeasure(16)
Android 動態修改漸變 GradientDrawable
4. Android canvas 如何繪制字體大小為25的一行文本
Canvas相當於畫布,字體的大小格式在Paint上設置才正確, Paint 相當於畫筆。代碼如下,沒有具體參數:希望能幫到你 Paint paint = new Paint(); paint.setTextSize(textSize);//設置字體大小 paint.setTypeface(typeface);//設置字體類型
5. Android在canvas中實現高性能的煙花/粒子特效
新年到了,本文將展示通過自定義view繪制煙花效果的案例,同時介紹一種優化canvas繪制時的性能的方法.
每點擊一下屏幕會產生一枚煙花,煙花飛到最上空會炸裂成60~100個碎片,
同屏可能有上千個粒子在不停更新它的位置.
github
這時候功能基本實現了,剩下的就是將每一個煙花繪制在canvas上,通常我們會這樣寫
然而你會發現性能很糟糕,幀數隨著粒子數的增加直線下降直到個位數,優化如下
some codes were from Daniel Shiffman
6. Android canvas繪制的可滑動刻度尺
首先放上所有成員變數
以上用到的方法
本Demo是使用Canvas進行繪制刻度,為了適配不同寬度的屏幕,所以小的刻度使用從中心指針處向兩邊繪制到屏幕邊界的方法,使用GestureDetector接管View的觸摸事件,在onScroll中修改體重值並不斷進行重繪,達到刻度尺滾動的效果。並在onFling中接收拋動的事件,開啟一個屬性動畫達到平滑的效果。由於我沒有在GestureDetector中找到能響應不fling的up事件,所以要自己手動在onTouchEvent中寫ACIONT_UP時的動作
遮罩層的實現方式,是drawRec 一個整個畫布大小的白色矩形,使用線性漸變,兩邊不透明到中間透明。注意,由於使用了PorterDuff.Mode.MULTIPLY來合成,所以需要使用到離屏緩沖,關於離屏緩沖可以看看 HenCoder
最後附上github: https://github.com/Pro47x/BodyWeightScaleTableView
7. Android 畫板canvas如何畫五角星
這個應該不難吧 用path path.moveTo(xx,xx);
path.lineTo(xx,xx);
算下這個五角星個點坐標就行了。