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);
}
}
그래서 나는 원이없는 검은 화면 만 있습니다. 왜 작동하지 않습니까? 그것을 고치는 방법?
보기의 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);
}
}
}
중앙에 원을 그리려면 편집하십시오 . 전체 캔버스를 중앙으로 변환 한 다음 중앙에 원을 그릴 수도 있습니다.
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
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);
}
위는 원을 렌더링하는 코드입니다. 수트에 맞게 매개 변수를 조정하십시오.
자체 CustomView 확장 View 클래스를 사용하는 경우 내부적으로 onDraw 메서드를 호출하는 canvas.invalidate () 메서드를 호출해야합니다. 캔버스에 기본 API를 사용하여 원을 그릴 수 있습니다. x, y 좌표는 원의 중심을 정의합니다. 페인트에서 색상과 스타일을 정의하고 페인트 개체를 전달할 수도 있습니다.
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);
}
마지막으로, 화면의 모든 뷰 새로 고침 또는 새 그리기에 대해 invalidate 메서드를 호출해야합니다. 전체 뷰가 다시 그려 지므로 비용이 많이 드는 호출입니다. 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;
}
획 원 캔버스를 그리는 예입니다.
val paint = Paint().apply {
color = Color.RED
style = Paint.Style.STROKE
strokeWidth = 10f
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.drawCircle(200f, 100f, 100f, paint)
}
결과
단색 원 캔버스를 그리는 예
val paint = Paint().apply {
color = Color.RED
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.drawCircle(200f, 100f, 100f, paint)
}
결과
도움이 되었기를 바랍니다.
참고 URL : https://stackoverflow.com/questions/17954596/how-to-draw-circle-by-canvas-in-android
'Programing' 카테고리의 다른 글
방화범 : iframe으로 cd하는 방법 (0) | 2020.11.21 |
---|---|
Nginx로 하나의 서버에서 두 사이트 제공 (0) | 2020.11.21 |
Emacs에서 현재 버퍼를 닫는 키 시퀀스는 무엇입니까? (0) | 2020.11.20 |
Eclipse의 프로젝트 탐색기보기에서 프로젝트 .jars 제거 (0) | 2020.11.20 |
C #에서 사용할 수있는 jQuery와 유사한 CSS / HTML 선택기가 있습니까? (0) | 2020.11.20 |