『壹』 android:如何用canvas在自定義view里畫圖
將構造函數改成這個試試
public iniView01(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
本人在寫的時候也遇到過代碼沒問題,但是一到虛擬機裡面運行就崩了,然後將構造函數改成這個就不會了
『貳』 android 怎麼手動繪制幾何圖形源碼
可以參考下面的代碼
package cn.m15.xys;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class Geometry extends Activity {
public int mScreenWidth = 0;
public int mScreenHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(new GeometryView(this));
super.onCreate(savedInstanceState);
}
class GeometryView extends View {
Paint mPaint = null;
public GeometryView(Context context) {
super(context);
mPaint = new Paint();
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//設置畫布顏色 也就是背景顏色
canvas.drawColor(Color.WHITE);
mPaint.setColor(Color.BLACK);
canvas.drawText("繪制無規則幾何圖形喔!!!", 150, 30, mPaint);
//繪制一條線
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(4);
canvas.drawLine(0, 0, 100, 100, mPaint);
//繪制一個矩形
mPaint.setColor(Color.YELLOW);
canvas.drawRect(0, 120, 100, 200, mPaint);
//繪制一個圓形
mPaint.setColor(Color.BLUE);
canvas.drawCircle(80, 300, 50, mPaint);
//繪制一個橢圓
mPaint.setColor(Color.CYAN);
canvas.drawOval(new RectF(300,370,120,100), mPaint);
//繪制多邊形
mPaint.setColor(Color.BLACK);
Path path = new Path();
path.moveTo(150+5 , 400 -50);
path.lineTo(150+45, 400 - 50);
path.lineTo(150+30, 460 - 50);
path.lineTo(150+20, 460 - 50);
path.close();
canvas.drawPath(path, mPaint);
}
}
}
『叄』 android自定義控制項怎麼實現動態繪制
代碼:
public class MyView extends View {
//坐標軸原點的位置
private int xPoint=60;
private int yPoint=260;
//刻度長度
private int xScale=8; //8個單位構成一個刻度
private int yScale=40;
//x與y坐標軸的長度
private int xLength=380;
private int yLength=240;
private int MaxDataSize=xLength/xScale; //橫坐標 最多可繪制的點
private List<Integer> data=new ArrayList<Integer>(); //存放 縱坐標 所描繪的點
private String[] yLabel=new String[yLength/yScale]; //Y軸的刻度上顯示字的集合
private Handler mh=new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what==0){ //判斷接受消息類型
MyView.this.invalidate(); //刷新View
}
};
};
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
for (int i = 0; i <yLabel.length; i++) {
yLabel[i]=(i+1)+"M/s";
}
new Thread(new Runnable() {
@Override
public void run() {
while(true){ //在線程中不斷往集合中增加數據
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(data.size()>MaxDataSize){ //判斷集合的長度是否大於最大繪制長度
data.remove(0); //刪除頭數據
}
data.add(new Random().nextInt(5)+1); //生成1-6的隨機數
mh.sendEmptyMessage(0); //發送空消息通知刷新
}
}
}).start();
}
『肆』 安卓編程語言開發 canvas 關於ondraw繪制問題
自定義View的實現方式大概可以分為三種,自繪控制項、組合控制項、以及繼承控制項。本文將介紹自繪控制項的用法。自繪控制項的意思是,這個控制項上的內容是用onDraw函數繪制出來的。關於onDraw函數的介紹可參看 Android視圖繪制流程完全解析,帶你一步步深入了解View(二) 。
例子1:在layout文件中使用自繪控制項
出處:http://blog.csdn.net/guolin_blog/article/details/17357967
下面我們准備來自定義一個計數器View,這個View可以響應用戶的點擊事件,並自動記錄一共點擊了多少次。新建一個CounterView繼承自View,代碼如下所示:
[java] view plain
public class CounterView extends View implements OnClickListener {
private Paint mPaint;
private Rect mBounds;
private int mCount;
public CounterView(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBounds = new Rect();
setOnClickListener(this);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.BLUE);
canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
mPaint.setColor(Color.YELLOW);
mPaint.setTextSize(30);
String text = String.valueOf(mCount);
mPaint.getTextBounds(text, 0, text.length(), mBounds);
float textWidth = mBounds.width();
float textHeight = mBounds.height();
canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
+ textHeight / 2, mPaint);
}
@Override
public void onClick(View v) {
mCount++;
invalidate();
}
}
可以看到,首先我們在CounterView的構造函數中初始化了一些數據,並給這個View的本身注冊了點擊事件,這樣當CounterView被點擊的時候,onClick()方法就會得到調用。而onClick()方法中的邏輯就更加簡單了,只是對mCount這個計數器加1,然後調用invalidate()方法。通過 Android視圖狀態及重繪流程分析,帶你一步步深入了解View(三) 這篇文章的學習我們都已經知道,調用invalidate()方法會導致視圖進行重繪,因此onDraw()方法在稍後就將會得到調用。
在布局文件中加入如下代碼:
[html] view plain
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.customview.CounterView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true" />
</RelativeLayout>
可以看到,這里我們將CounterView放入了一個RelativeLayout中。注意,自定義的View在使用的時候一定要寫出完整的包名,不然系統將無法找到這個View。
例子2:通過實例化對象的方式使用自定義控制項
出處:http://blog.csdn.net/ameyume/article/details/6031024
Android繪圖操作,通過繼承View實現,在onDraw函數中實現繪圖。
下面是一個簡單的例子:
[java] view plain
public class AndroidTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyView mv = new MyView(this);
setContentView(mv);
}
public class MyView extends View {
MyView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
// 首先定義一個paint
Paint paint = new Paint();
// 繪制矩形區域-實心矩形
// 設置顏色
paint.setColor(Color.BLUE);
// 設置樣式-填充
paint.setStyle(Style.FILL);
// 繪制一個矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
// 繪空心矩形
// 設置顏色
paint.setColor(Color.RED);
// 設置樣式-空心矩形
paint.setStyle(Style.STROKE);
// 繪制一個矩形
canvas.drawRect(new Rect(10, 10, 100, 30), paint);
// 繪文字
// 設置顏色
paint.setColor(Color.GREEN);
// 繪文字
canvas.drawText("Hello", 10, 50, paint);
// 繪圖
// 從資源文件中生成點陣圖
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
// 繪圖
canvas.drawBitmap(bitmap, 10, 60, paint);
}
}
『伍』 android用Xfermode畫圖時Mode.DST_IN無效
Mode.DST_IN:表示 用DST畫筆,在DST區域范圍內,繪制SRC與DST相交部分圖形。
DST畫筆:即為繪制rawBitmap畫筆;
DST區域范圍:即為rawBitmap(也是localBitmap)區域。
SRC與DST相交部分:完全相交於rawBitmap內,所以畫出來的依然還是rawBitmap本身。
您的意圖是想只顯示SRC與DST相交部分,且是用rawBitmap的畫筆畫出局部的rawBitmap圖像。
正確的做法是:
先畫drawCircle,然後paint.setXfermode:SRC_IN,然後畫drawBitmap。
『陸』 如何使用Android的VectorDrawable類繪制矢量圖
1. 創建Vector Drawable
從相似角度來看,VectorDrawable與標准SVG圖形都是利用path值繪制完成的。不過如何利用SVG path繪制圖形並不在本篇文章的探討范圍之內,大家可以點擊此處從W3C網站處獲取必要的說明資料。在本文當中,我們只需要了解到path標簽的作用是進行圖形繪制即可。讓我們首先從SVG文件入手,看看以下圖形是如何被繪制出來的:
這一圖形共由五個主要部分所組成:
一個圓角四邊形作為CPU主體,該四邊形由兩條拱狀弧線構成。
四組各自包含五根線條的圖形,用於充當CPU的外延線路。
雖然看起來有點繁雜,但大家其實用不著糾結於以上代碼的具體含義,而且這完全不會影響到我們接下來要進行的VectorDrawable繪制工作。不過需要強調的是,我將前面提到的五大圖形組成部分在代碼中作為獨立的區塊來處理,這是為了增強代碼內容的可讀性。
首先,我們需要利用兩條拱形弧線來繪制出圓角四邊形,而在接下來的內容中我們會探討如何分別表現出上、下、左、右四個方位的外延線條。為了將上述SVG代碼轉化為VectorDrawable,大家首先需要在XML當中定義vector對象。以下代碼提取自本篇文章示例代碼當中的vector_drawable_cpu.xml文件。
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="64dp" android:width="64dp" android:viewportHeight="600" android:viewportWidth="600" > </vector>
在此之後,大家可以向其中添加path數據。下列代碼同樣被拆分成了五個不同的path標簽而非將其作為整體處理,這當然也是為了保證內容的可讀性。
正如大家所見,每個path片段都只需要利用pathData屬性進行繪制。現在我們可以將VectorDrawable XML文件作為一個可繪制對象納入到標准ImageView當中,而且其能夠根據應用程序的實際需要任意進行尺寸縮放——完全不需要再修改任何Java代碼。
2. 為Vector Drawables添加動畫效果
現在我們已經了解了如何以純代碼方式創建圖形,接下來要做的是找點樂子——為其添加動畫效果。在以下動畫中,大家會發現作為延伸線路的各組線條會不斷指向並遠離CPU本體進行移動。
為了達到這一目標,大家需要將包含動畫效果的每個片段包含在一個<group>標簽當中。
接下來,我們需要為每個動畫類型創建animator文件。在本次示例中,每組線路各使用一個animator,這就意味著共需要四個animator。以下代碼所示為上方線路的動畫效果,大家還需要為下、左、右線路設定類似的效果。每個animator XML文件都被包含在了本項目的示例代碼當中。
如大家所見,propertyName被設定為translateY,這意味著該動畫將沿Y軸方向移動。而valueFrom與valueTo則控制著位移的起點與終點。通過將repeatMode設置為reverse而repeatCount設置為infinite,整個動畫會一直循環下去,其效果則在VectorDrawable處體現出來。該動畫的ration被設定為250,其時長單位為毫秒。
為了將該動畫應用到自己的可繪制文件當中,大家需要創建一個新的animated-vector XML文件,從而將這些animator分配給各VectorDrawable組。以下代碼的作用是創建該animated_cpu.xml文件。
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vector_drawable_cpu"> <target android:animation="@animator/pulse_top" android:name="top" /> <target android:animation="@animator/pulse_right" android:name="right" /> <target android:animation="@animator/pulse_left" android:name="left" /> <target android:animation="@animator/pulse_bottom" android:name="bottom" /> </animated-vector>
當所有必要的XML文件都已經准備完成後,大家就可以將animated_cpu.xml加入到ImageView當中進行顯示了。
<ImageView android:id="@+id/cpu" android:layout_width="64dp" android:layout_height="64dp" android:src="@drawable/animated_cpu" />
要開始播放動畫效果,大家需要從ImageView當中獲取Animatable實例並調用start。
ImageView mCpuImageView = (ImageView) findViewById( R.id.cpu ); Drawable drawable = mCpuImageView.getDrawable(); if (drawable instanceof Animatable) { ((Animatable) drawable).start(); }
在start被調用之後,CPU圖形當中的線路圖形就會開始移動——整個過程只需要使用少量Java代碼即可實現。
3. Vector Drawables的變化方式
對於VectorDrawable來說,最常見的一種使用方式就是將一個圖形轉化至另一個圖形,例如操作欄中的圖標由漢堡變成箭頭。要做到這一點,源與目標path二者都必須具備同樣的格式以保證元素數量上的一致。在本次示例中,我們將如前文圖片所示嘗試將左箭頭轉化為右箭頭。
<string name="left_arrow">M300,70 l 0,70 -70,-70 0,0 70,-70z</string> <string name="right_arrow">M300,70 l 0,-70 70,70 0,0 -70,70z</string>
接下來,大家需要利用path為left_arrow建立一個初始drawable。在示例代碼中,我們將其命名為vector_drawable_left_arrow.xml。
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="64dp" android:width="64dp" android:viewportHeight="600" android:viewportWidth="600" > <path android:name="left_arrow" android:fillColor="#000000" android:pathData="@string/left_arrow"/> /vector>
CPU動畫與這里提到的圖形變化示例之間,最主要的區別就體現在animator_left_right_arrow.xml文件當中。
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:ration="1000" android:propertyName="pathData" android:valueFrom="@string/left_arrow" android:valueTo="@string/right_arrow" android:valueType="pathType" android:repeatMode="reverse" android:repeatCount="-1"/> </set>
大家可能已經注意到了,valueFrom與valueTo兩項屬性會引用左箭頭與右箭頭的path數據,valueType被設定為pathType而propertyName則被設定為pathData。當以上設定完成之後,該animator將明確如何將一組path數據轉化為另一組。當該animator結束之後,我們還需要利用新的animated-vector對象將VectorDrawable分配至objectAnimator。
<?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/vector_drawable_left_arrow"> <target android:name="left_arrow" android:animation="@animator/animator_left_right_arrows" /> </animated-vector>
最後,大家還需要將該動畫drawable分配至ImageView,而後在自己的Java代碼中開始運行。
<ImageView
android:id="@+id/left_right_arrow"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_below="@+id/cpu"
android:src="@drawable/animated_arrow" />
mArrowImageView = (ImageView) findViewById( R.id.left_right_arrow );
drawable = mArrowImageView.getDrawable();
if (drawable instanceof Animatable) {
((Animatable) drawable).start();
}
『柒』 高分懸賞:求Android Achartengine 繪制動態更新的曲線圖的代碼
可以用AndroidPlot,也是用於Android的第三方類庫,可以實現圖形的動態顯示。
『捌』 Android繪制圖片的幾種方式
在android中做圖像鏡像有很多方法,今天算是學習了!
兩種方法如下:
復制代碼 代碼如下:
//方法一
Matrix matrix = new Matrix();
matrix.postScale(leftOrRight, 1, bmpW/2, bmpH/2);//前兩個是xy變換,後兩個是對稱軸中心點
matrix.postTranslate(x, y);
canvas.drawBitmap(bmpLuffy[0], matrix, paint);
//方法二
// canvas.save();
// canvas.scale(-1, 1, x + bmpLuffy[0].getWidth() / 2, y + bmpLuffy[0].getHeight() / 2);
// canvas.drawBitmap(bmpLuffy[0], x, y, paint);
// canvas.restore();
方法一,使用矩陣的方式(3x3)矩陣:
1、先使用postScale的方式將圖片以點(bmpW/2,bmpH/2)為中心,以x=bmpW/2為對稱軸翻轉;
2、使用postTranslate,將圖片移到(x,y)坐標
方法二,畫布翻轉(略)
注意如下問題:
對於其中的bmpW和bmpH是指所用圖片的寬高,需要使用圖片bmp.getWidth()和bmp.getHeight()獲取,
不能使用PC上看到的大小,否則可能會出現錯位!
『玖』 Android怎麼做數據折線圖
這個可以用安卓自定義view里的ondraw()方法來實現,通過獲取的坐標,畫圖連接起來即可 下面的例子是一個畫矩形 的代碼,你可以試著改成畫曲線 public class AndroidTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyView mv = new MyView(this); setContentView(mv); } public class MyView extends View { MyView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); // 首先定義一個paint Paint paint = new Paint(); // 繪制矩形區域-實心矩形 // 設置顏色 paint.setColor(Color.BLUE); // 設置樣式-填充 paint.setStyle(Style.FILL); // 繪制一個矩形 canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint); // 繪空心矩形 // 設置顏色 paint.setColor(Color.RED); // 設置樣式-空心矩形 paint.setStyle(Style.STROKE); // 繪制一個矩形 canvas.drawRect(new Rect(10, 10, 100, 30), paint); // 繪文字 // 設置顏色 paint.setColor(Color.GREEN); // 繪文字 canvas.drawText("Hello", 10, 50, paint); // 繪圖 // 從資源文件中生成點陣圖 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon); // 繪圖 canvas.drawBitmap(bitmap, 10, 60, paint); } } }
『拾』 android的如何使用異或方式繪圖
1)使用canvas/paint方式的繪圖為軟體渲染,通過cpu實現;使用opengles/shader方式的繪圖為硬體加速渲染,通過gpu實現。
2)surfaceview和glsurfaceview的顯示一般結合opengles,使用紋理(texture),為硬體渲染,通過gpu實現
3)glsurfaceview是surfaceview的子類,在後者基礎上封裝了egl環境管理,以及render線程
4)opengles繪制函數及shader是平台無關的,需要egl環境對接android/ios等平台
5)android graphic 底層都與BufferQueue、Surfaceflinger等相關,具體可參考android開發者文檔
個人經驗,如有不對之處請幫忙指出
作者:阿占
鏈接:https://www.hu.com/question/36030004/answer/65581599
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請註明出處。