Android:使用drawText()写入时文本不可见
更多代码Android:使用drawText()写入时文本不可见,android,graphics,canvas,drawtext,Android,Graphics,Canvas,Drawtext,更多代码 @Override protected void onDraw(Canvas canvas) { //Note:I do not want to use the canvas object from this function param //If i do so its working , But i would like to understand why the fo
@Override
protected void onDraw(Canvas canvas)
{
//Note:I do not want to use the canvas object from this function param
//If i do so its working , But i would like to understand why the following is not working
Canvas c =new Canvas();
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
c.drawText("HELLO CANVAS",200,300,paint);
}
公共类graphicProj扩展活动{
私人帆布;
@凌驾
创建时的公共void(Bundle savedInstanceState){
{
....
SimpleView SimpleView_obj=新SimpleView(本);
setContentView(simpleview_obj);
simpleview_obj.onDraw(帆布);
.....
新建GetData().execute();
}
私有静态类SimpleView扩展视图{
private ShapeDrawable mDrawable=新的ShapeDrawable();
....
受保护的void onDraw(画布){
//绘制图形对象
....
}
}
公共类GetData扩展异步任务{
@凌驾
受保护的void onPreExecute(){
日志d(“项目”、“开始”);
}
@凌驾
受保护的空位背景(空位…未使用){
////我的计算和读取frm数据流
}
@凌驾
受保护的void onProgressUpdate(字符串…数据){
//我不断更新结果。。。
油漆=新油漆();
绘制.设置样式(绘制.样式.填充);
paint.setAntiAlias(真);
油漆。设置颜色(颜色。白色);
画布.绘图文本(结果,200,300,绘制);
}
@凌驾
受保护的void onPostExecute(未使用的void){
日志d(“项目”、“结束”);
}
}
}
不在这里,或者在你的其他问题中,你是否提供了足够的信息,说明你为什么不能这样做。没有理由在新画布上而不是现有画布上绘制
代码不起作用,因为您的新画布c
未分配任何内容。这就像为日志创建字符串myString
,但从不使用log.d(标记,myString)
编辑(阅读所有评论后)
如果在onCreate()中计算一个值,并希望在onDraw()中显示该值,则只需执行此操作。将结果存储在成员变量中,然后可以在onDraw()中访问它
否则:请提供您的完整代码。我想您只是做的方式比它应该更复杂
edit2
你的代码有点凌乱,在不应该做的地方做了很多事情。因此在onProgressUpdate()
中绘图是严重错误的。你应该封装你的计算和绘图
您应该做什么(无论如何,我建议使用SurfaceView而不是View…):
您应该启动AsynchTask,更新要绘制的字符串。该字符串应该是视图中的一个变量,您可以在视图中使用它进行绘制。
绘图线程应该调用绘图本身(我记得:使用SurfaceView而不是视图作为父类)。在该onDraw()中,您应该只使用绘制对象、给定画布和要绘制的字符串(不要忘记将paint
变量也设为成员变量,以防止由于性能/内存原因而反复重新创建同一对象)
如果您不知道如何使用SurfaceView,或者如果您想了解如何使用绘图线程,请阅读我的2d绘图教程:www.droidnova.com/2d-tutorial-series
最后一句话:你用正确的方式做了很多事情,只是混淆了你做这些事情的地方。你应该试着重新思考你真正想要实现的目标,以及如何以最简单的方式来实现。也许我的教程可以帮你澄清一点。不在这里,或者在你的其他问题中,你提供了足够的信息吗为什么您
不能这样做
。没有理由在新画布上绘制,而不是在现有画布上绘制
代码不起作用,因为您的新画布c
未分配任何内容。这就像为日志创建字符串myString
,但从不使用log.d(标记,myString)
编辑(阅读所有评论后)
如果在onCreate()中计算一个值,并希望在onDraw()中显示该值,则只需执行此操作。将结果存储在成员变量中,然后可以在onDraw()中访问它
否则:请提供您的完整代码。我想您只是做的方式比它应该更复杂
edit2
你的代码有点凌乱,在不应该做的地方做了很多事情。因此在onProgressUpdate()
中绘图是严重错误的。你应该封装你的计算和绘图
您应该做什么(无论如何,我建议使用SurfaceView而不是View…):
您应该启动AsynchTask,更新要绘制的字符串。该字符串应该是视图中的一个变量,您可以在视图中使用它进行绘制。
绘图线程应该调用绘图本身(我记得:使用SurfaceView而不是视图作为父类)。在该onDraw()中,您应该只使用绘制对象、给定画布和要绘制的字符串(不要忘记将paint
变量也设为成员变量,以防止由于性能/内存原因而反复重新创建同一对象)
如果您不知道如何使用SurfaceView,或者如果您想了解如何使用绘图线程,请阅读我的2d绘图教程:www.droidnova.com/2d-tutorial-series
最后一句话:你用正确的方式做了很多事情,只是把你做事情的地方弄混了。你应该试着重新思考你真正想要达到的目标,以及如何以最简单的方式来完成。也许我的教程可以帮你澄清一点。你怎么知道它不起作用?如果我把最后一行改为drawText(“HELLO canvas”,200300,paint);它可以工作。但我想知道为什么上面的一个不工作。在中不工作
public class graphicProj extends Activity {
private Canvas canvas;
@Override
public void onCreate(Bundle savedInstanceState) {
{
....
SimpleView simpleview_obj = new SimpleView(this);
setContentView(simpleview_obj);
simpleview_obj.onDraw(canvas);
.....
new GetData().execute();
}
private static class SimpleView extends View {
private ShapeDrawable mDrawable = new ShapeDrawable();
....
protected void onDraw(Canvas canvas) {
//draw graphic objects
....
}
}
public class GetData extends AsyncTask<Void, String, Void> {
@Override
protected void onPreExecute() {
Log.d("PROJ","STARTIN");
}
@Override
protected Void doInBackground(Void... unused) {
////My calculation and reading frm DataStream
}
@Override
protected void onProgressUpdate(String... data) {
//I Keep updating the result...
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
canvas.drawText(result, 200, 300, paint);
}
@Override
protected void onPostExecute(Void unused) {
Log.d("PROJ","END");
}
}
}