キャンバスで円を描きたいです。ここに私のコードがあります:
[MyActivity.Java]:
public class MyActivity extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
...
setContentView(new View(this,w,h));
}
}
[View.Java]:
public class View extends SurfaceView
{
public View(Context context, int w, int h)
{
super(context);
Canvas grid = new Canvas(Bitmap.createBitmap(h,w, Bitmap.Config.ARGB_8888));
grid. drawColor(Color.WHITE);
Paint paint = new Paint();
Paint.setStyle(Paint.Style.FILL);
grid.drawCircle(w/2, h/2 , w/2, Paint);
}
}
だから、円のない黒い画面があります。なぜ機能しないのですか?修正方法
ビューのonDrawメソッドをオーバーライドして、円を描くことができます。
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(x, y, radius, Paint);
}
カスタムビューの描画に関するより良いリファレンスについては、公式のAndroidドキュメントをご覧ください。
http://developer.Android.com/training/custom-views/custom-drawing.html
import Android.app.Activity;
import Android.content.Context;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Paint;
import Android.os.Bundle;
import Android.view.View;
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
public class MyView extends View
{
Paint paint = null;
public MyView(Context context)
{
super(context);
Paint = new Paint();
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
int x = getWidth();
int y = getHeight();
int radius;
radius = 100;
Paint.setStyle(Paint.Style.FILL);
Paint.setColor(Color.WHITE);
canvas.drawPaint(Paint);
// Use Color.parseColor to define HTML colors
Paint.setColor(Color.parseColor("#CD5C5C"));
canvas.drawCircle(x / 2, y / 2, radius, Paint);
}
}
}
Edit中心に円を描きたい場合。キャンバス全体を中心に移動してから、中心に円を描くこともできます。
canvas.translate(getWidth()/2f,getHeight()/2f);
canvas.drawCircle(0,0, radius, Paint);
これらの2つのリンクも役立ちます
http://www.compiletimeerror.com/2013/09/introduction-to-2d-drawing-in-Android.html#.VIg_A5SSy9o
http://Android-coding.blogspot.com/2012/04/draw-circle-on-canvas-canvasdrawcirclet.html
public class CircleView extends View {
private static final String COLOR_HEX = "#E74300";
private final Paint drawPaint;
private float size;
public CircleView(final Context context, final AttributeSet attrs) {
super(context, attrs);
drawPaint = new Paint();
drawPaint.setColor(Color.parseColor(COLOR_HEX));
drawPaint.setAntiAlias(true);
setOnMeasureCallback();
}
@Override
protected void onDraw(final Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(size, size, size, drawPaint);
}
private void setOnMeasureCallback() {
ViewTreeObserver vto = getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
removeOnGlobalLayoutListener(this);
size = getMeasuredWidth() / 2;
}
});
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void removeOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener listener) {
if (Build.VERSION.SDK_INT < 16) {
getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}
}
}
XMLの例:5dpの円を生成します
<com.example.CircleView
Android:layout_width="10dp"
Android:layout_height="10dp"/>
@Override
public void onDraw(Canvas canvas){
canvas.drawCircle(xPos, yPos,radius, Paint);
}
上記は円をレンダリングするコードです。必要に応じてパラメーターを調整します。
Viewクラスを拡張する独自のCustomViewを使用している場合、onDrawメソッドを内部的に呼び出すcanvas.invalidate()メソッドを呼び出す必要があります。キャンバスのデフォルトAPIを使用して、円を描くことができます。 x、y座標は、円の中心を定義します。 Paintで色とスタイルを定義して、Paintオブジェクトを渡すこともできます。
public class CustomView extends View {
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
setupPaint();
}
}
デフォルトのペイント設定とキャンバスを定義します(コンストラクターでペイントを初期化して、どこでも同じオブジェクトを再利用し、必要に応じて特定の設定のみを変更できるようにします)
private Paint drawPaint;
// Setup Paint with color and stroke styles
private void setupPaint() {
drawPaint = new Paint();
drawPaint.setColor(Color.BLUE);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(5);
drawPaint.setStyle(Paint.Style.FILL_AND_STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
}
キャンバスオブジェクトを初期化する
private Canvas canvas;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.canvas = canvas;
canvas.drawCircle(xCordinate, yCordinate, RADIUS, drawPaint);
}
最後に、画面上のすべてのビューの更新または新しい描画に対して、無効化メソッドを呼び出す必要があります。ビュー全体が再描画されることを覚えておいてください。したがって、これは高価な呼び出しです。 onDrawで必要な操作のみを行うようにしてください
canvas.invalidate();
キャンバス描画の詳細については、 https://medium.com/@mayuri.k18/Android-canvas-for-drawing-and-custom-views-e1a3e90d468b を参照してください
これを試して
円を描くためのコード全体、またはプロジェクトのソースコードをダウンロードして、Androidスタジオでテストします。 プログラムでキャンバスに円を描きます。
import Android.graphics.Bitmap;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.Paint;
import Android.graphics.Path;
import Android.graphics.Point;
import Android.graphics.PorterDuff;
import Android.graphics.PorterDuffXfermode;
import Android.graphics.Rect;
import Android.graphics.RectF;
import Android.widget.ImageView;
public class Shape {
private Bitmap bmp;
private ImageView img;
public Shape(Bitmap bmp, ImageView img) {
this.bmp=bmp;
this.img=img;
onDraw();
}
private void onDraw(){
Canvas canvas=new Canvas();
if (bmp.getWidth() == 0 || bmp.getHeight() == 0) {
return;
}
int w = bmp.getWidth(), h = bmp.getHeight();
Bitmap roundBitmap = getRoundedCroppedBitmap(bmp, w);
img.setImageBitmap(roundBitmap);
}
public static Bitmap getRoundedCroppedBitmap(Bitmap bitmap, int radius) {
Bitmap finalBitmap;
if (bitmap.getWidth() != radius || bitmap.getHeight() != radius)
finalBitmap = Bitmap.createScaledBitmap(bitmap, radius, radius,
false);
else
finalBitmap = bitmap;
Bitmap output = Bitmap.createBitmap(finalBitmap.getWidth(),
finalBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, finalBitmap.getWidth(),
finalBitmap.getHeight());
Paint.setAntiAlias(true);
Paint.setFilterBitmap(true);
Paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
Paint.setColor(Color.parseColor("#BAB399"));
canvas.drawCircle(finalBitmap.getWidth() / 2 + 0.7f, finalBitmap.getHeight() / 2 + 0.7f, finalBitmap.getWidth() / 2 + 0.1f, Paint);
Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(finalBitmap, rect, rect, Paint);
return output;
}