Как нарисовать круг на холсте в Android?
Я хочу нарисовать круг на холсте. Вот мой код:
[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);
}
}
Итак, у меня просто черный экран без круга.
Почему это не работает? Как это исправить?
Переведено автоматически
Ответ 1
Вы можете переопределить метод 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
Ответ 2
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);
}
}
}
Редактировать
если вы хотите нарисовать круг в центре. Вы также можете перевести весь холст в center, а затем нарисовать круг в центре. используя
canvas.translate(getWidth()/2f,getHeight()/2f);
canvas.drawCircle(0,0, radius, paint);
Эти две ссылки также помогают
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
Ответ 3
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"/>
Ответ 4
Если вы используете свой собственный класс расширенного представления CustomView, вам необходимо вызвать метод canvas.invalidate(), который будет внутренне вызывать метод onDraw . Вы можете использовать API по умолчанию для canvas, чтобы нарисовать круг. Координаты x, y определяют центр круга. Вы также можете определить цвет и стиль в paint и передать объект paint.
public class CustomView extends View {
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
setupPaint();
}
}
Определите настройки paint по умолчанию и canvas (инициализируйте paint в конструкторе, чтобы вы могли повторно использовать один и тот же объект везде и изменять только определенные настройки там, где требуется)
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);
}
И инициализировать объект canvas
private Canvas canvas;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.canvas = canvas;
canvas.drawCircle(xCordinate, yCordinate, RADIUS, drawPaint);
}
И, наконец, для каждого обновления вида или нового рисования на экране вам нужно вызывать метод invalidate . Помните, что весь ваш вид перерисовывается, следовательно, это дорогостоящий вызов. Убедитесь, что вы выполняете только необходимые операции в onDraw
canvas.invalidate();
Для получения более подробной информации о рисовании на холсте см. https://medium.com/@mayuri.k18/android-canvas-for-drawing-and-custom-views-e1a3e90d468b