我正在尝试使用下面的代码显示文本.问题是文本不是水平居中的.当我设置坐标时drawText,它会在此位置设置文本的底部.我希望绘制文本,以便文本也水平居中.
这是一张进一步显示我的问题的图片:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
Run Code Online (Sandbox Code Playgroud) 是否有一种方法可以根据用于绘制它的Paint使用drawText()方法返回要在Android画布上绘制的文本的宽度(以像素为单位)?
有没有直接测量文字高度的方法?我现在这样做的方法是使用Paint measureText()来获取宽度,然后通过试验和错误找到一个值来获得近似高度.我也一直在搞乱FontMetrics,但所有这些似乎都是近似的方法.
我正在尝试扩展不同分辨率的东西.我可以做到,但我最终得到了令人难以置信的冗长代码,并通过大量计算来确定相对大小.我讨厌它!一定有更好的方法.
一个有希望的快速问题,但我似乎无法找到任何示例......我想View通过a 将多行文本写入自定义Canvas,并且onDraw()我有:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Run Code Online (Sandbox Code Playgroud)
我希望这会导致换行,但相反,我会看到神秘的角色\n.
任何指针赞赏.
保罗
我很难理解绘制的过程,SurfaceView因此也很难理解在Android中使用的整个Surface/ Canvas/ Bitmap系统.
我已经阅读了所有文章和API文档页面,我可以在android-developers网站上找到,一些android图形教程,LunarLander源代码和这个问题.
请告诉我,这些陈述中哪些是真的,哪些不是,为什么.
Canvas有它自己的Bitmap附加.Surface有它自己的Canvas附加.View的窗口共享相同Surface,因此共享相同Canvas.SurfaceView是子类View,它与其他View子类View本身不同,它有自己Surface的绘制.还有一个问题:
Surface如果已经有一个Canvas用于位图的高级操作,为什么需要一个类.举一个Canvas不适合做Surface可以做的工作的情况的例子.我需要建立一个用手指在画布上绘画的项目,
得到我的手指的触摸事件和动作事件,然后绘制.
任何人都可以建议我如何开始项目,
什么是做这样的事情的最佳组件?
我想创建一个空位图并将canvas设置为该位图,然后在位图上绘制任何形状.
如何使用borderWidth = 3和borderColor = black绘制空矩形,并且矩形内的部分没有内容或颜色.Canvas中使用哪个功能
void drawRect(float left, float top, float right, float bottom, Paint paint)
void drawRect(RectF rect, Paint paint)
void drawRect(Rect r, Paint paint)
Run Code Online (Sandbox Code Playgroud)
谢谢.
我试试这个例子
Paint myPaint = new Paint();
myPaint.setColor(Color.rgb(0, 0, 0));
myPaint.setStrokeWidth(10);
c.drawRect(100, 100, 200, 200, myPaint);
Run Code Online (Sandbox Code Playgroud)
它绘制矩形并用黑色填充它但我只想像这个图像一样"框架":

为了制作一个简单的游戏,我使用了一个模板来绘制带有这样的位图的画布:
private void doDraw(Canvas canvas) {
for (int i=0;i<8;i++)
for (int j=0;j<9;j++)
for (int k=0;k<7;k++) {
canvas.drawBitmap(mBits[allBits[i][j][k]], i*50 -k*7, j*50 -k*7, null); } }
Run Code Online (Sandbox Code Playgroud)
(画布在"run()"中定义/ SurfaceView存在于GameThread中.)
我的第一个问题是如何清除(或重绘)整个画布以获得新的布局?
其次,如何更新屏幕的一部分?
// This is the routine that calls "doDraw":
public void run() {
while (mRun) {
Canvas c = null;
try {
c = mSurfaceHolder.lockCanvas(null);
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING)
updateGame();
doDraw(c); }
} finally {
if (c != null) {
mSurfaceHolder.unlockCanvasAndPost(c); } } } }
Run Code Online (Sandbox Code Playgroud)