Sto tentando di disegnare una linea in una personalizzata View
. Qui ho creato un semplice Path
con un solo segmento, creato uno PathShape
da quello e infine inserito in uno ShapeDrawable
con l'intenzione di utilizzarlo per disegnare sullo all'interno dello Canvas
. Tuttavia, questo non funziona. Vedi il mio esempio, qui.Come si dovrebbe usare ShapeDrawable con PathShape per tracciare una linea su una vista personalizzata?
package com.example.test;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.PathShape;
import android.util.Log;
import android.view.View;
public class TestView extends View {
private Path mPath = null;
private Paint mPaint = null;
private PathShape mPathShape = null;
private ShapeDrawable mShapeDrawable = null;
public TestView(Context context) {
super(context);
}
private void init() {
int width = this.getWidth()/2;
int height = this.getHeight()/2;
Log.d("init", String.format("width: %d; height: %d", width, height));
this.mPath = new Path();
this.mPath.moveTo(0, 0);
this.mPath.lineTo(width, height);
this.mPaint = new Paint();
this.mPaint.setColor(Color.RED);
this.mPathShape = new PathShape(this.mPath, 1, 1);
this.mShapeDrawable = new ShapeDrawable(this.mPathShape);
this.mShapeDrawable.getPaint().set(this.mPaint);
this.mShapeDrawable.setBounds(0, 0, width, height);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
// Doing this here because in the constructor we don't have the width and height of the view, yet
this.init();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.d("onDraw", "Drawing");
// This works, but won't let me do what I'm really trying to do
canvas.drawLine(0.0f, 0.0f, this.getWidth()/2.0f, this.getHeight()/2.0f, this.mPaint);
// This should work, but does not
//this.mPathShape.draw(canvas, this.mPaint);
// This should work, but does not
//this.mShapeDrawable.draw(canvas);
}
}
Come si può vedere dai miei commenti nel metodo onDraw()
, né utilizzando il PathShape
né la ShapeDrawable
per disegnare la Path
sul Canvas
funziona realmente. Nulla è disegnato quando ci provo. Qualcuno ha qualche idea del perché?
Il dispositivo su cui sto eseguendo il test funziona con Android 4.1.1.
Solo curioso: hai provato a creare un nuovo oggetto Paint all'interno di onDraw. Lo sto facendo e ho avuto successo con le bitmap ma non ero sicuro se fosse necessario o meno. – JavaCoderEx
Non avevo, dal momento che non volevo creare oggetti in onDraw (in realtà causa un avvertimento da Lint). Tuttavia, l'ho provato proprio ora e ho ottenuto gli stessi risultati. Nessun successo. – Daniel
Dopo alcune ulteriori indagini e la mancanza di risposta qui, penso che questo sia semplicemente rotto e ho inviato una segnalazione di bug. http://code.google.com/p/android/issues/detail?id=35229 – Daniel