Je veux dessiner un cercle sur une toile. Voici mon code:
[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);
}
}
Donc, je viens d'avoir un écran noir sans cercle . Pourquoi cela ne fonctionne pas? Comment le réparer?
Vous pouvez remplacer la méthode onDraw de votre vue et dessiner le cercle.
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(x, y, radius, Paint);
}
Pour une meilleure référence sur le dessin de vues personnalisées, consultez la documentation officielle d'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);
}
}
}
Éditer Si vous voulez dessiner un cercle au centre. Vous pouvez également traduire votre toile entière en son centre, puis tracer un cercle en son centre.
canvas.translate(getWidth()/2f,getHeight()/2f);
canvas.drawCircle(0,0, radius, Paint);
Ces deux liens aident aussi
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);
}
}
}
Exemple Xml: produira un cercle de 5dp
<com.example.CircleView
Android:layout_width="10dp"
Android:layout_height="10dp"/>
@Override
public void onDraw(Canvas canvas){
canvas.drawCircle(xPos, yPos,radius, Paint);
}
Ci-dessus est le code pour rendre un cercle. Ajustez les paramètres à votre convenance.
Si vous utilisez votre propre classe de vue extensible CustomView, vous devez appeler la méthode canvas.invalidate () qui appellera en interne la méthode onDraw. Vous pouvez utiliser l'API par défaut pour le canevas pour dessiner un cercle. Les coordonnées x, y définissent le centre du cercle. Vous pouvez également définir la couleur et le style dans Paint et transmettre l'objet Paint.
public class CustomView extends View {
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
setupPaint();
}
}
Définissez les paramètres de peinture et le canevas par défaut (Initialisez Paint dans le constructeur pour pouvoir réutiliser le même objet partout et ne modifier que des paramètres spécifiques, le cas échéant).
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);
}
Et initialise l'objet canvas
private Canvas canvas;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.canvas = canvas;
canvas.drawCircle(xCordinate, yCordinate, RADIUS, drawPaint);
}
Et enfin, pour chaque rafraîchissement de vue ou nouveau dessin à l'écran, vous devez appeler la méthode invalidate. Rappelez-vous que votre vue entière est redessinée, il s'agit donc d'un appel coûteux. Assurez-vous de ne faire que les opérations nécessaires dans onDraw
canvas.invalidate();
Pour plus de détails sur le dessin sur toile, consultez https://medium.com/@mayuri.k18/Android-canvas-for-drawing-and-custom-views-e1a3e90d468b
Essaye ça
L'ensemble du code permettant de dessiner un cercle ou de télécharger le code source du projet et de le tester sur votre studio Android. Dessine un cercle sur la toile par programmation.
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;
}
Voici un exemple pour dessiner une toile de cercle à traits
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)
}
Résultat
Exemple pour dessiner une toile de cercle solide
val Paint = Paint().apply {
color = Color.RED
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
canvas?.drawCircle(200f, 100f, 100f, Paint)
}
Résultat
J'espère que ça aide