如何在Android中使用TextView显示圆形文本

17

我想在我的安卓应用程序中展示圆形文本,我知道可以使用自定义文本视图实现,但有没有人能给我正确的代码? 我还附上了我想要的外观类型的图片。

输入图像说明


请查看https://dev59.com/VWkw5IYBdhLWcg3wE2hA。 - Kartik Domadiya
抱歉,但它显示的是完整的循环文本。 - Rishabh Agrawal
4
您需要理解并根据您的需求进行修改。 - Kartik Domadiya
7个回答

25

你可以尝试这个经过测试并且完全运行的代码:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new GraphicsView(this));
    }

    static public class GraphicsView extends View {
        private static final String QUOTE = "This is a curved text";
        private Path circle;
        private Paint cPaint;
        private Paint tPaint;

        public GraphicsView(Context context) {
            super(context);

            int color = Color.argb(127, 255, 0, 255);

            circle = new Path();
            circle.addCircle(230, 350, 150, Direction.CW);

            cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            cPaint.setStyle(Paint.Style.STROKE);
            cPaint.setColor(Color.LTGRAY);
            cPaint.setStrokeWidth(3);

            setBackgroundResource(R.drawable.heart);

            tPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            tPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            tPaint.setColor(Color.BLACK);
            tPaint.setTextSize(50);
        }
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawTextOnPath(QUOTE, circle, 485, 20, tPaint);
        }
    }
}

输出将会是:

在此输入图像描述

希望这可以帮到你。


6

创建一个自定义视图并重写onDraw方法。在onDraw中,创建一个路径并使用drawTextOnPath方法。类似于这样的代码,textToDraw是你想要显示的文本,Paint是你想要使用的画笔。

@Override onDraw(Canvas canvas){
    Path path = new Path();
    path.addCircle(x, y, 200, Path.Direction.CW);
    canvas.drawTextOnPath(textToDraw, path, textX, textY, paint);
}

http://developer.android.com/training/custom-views/index.html 这个链接是关于如何自定义视图的培训资料。 http://developer.android.com/reference/android/graphics/Canvas.html#drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint) 这个链接是有关在路径上绘制文本的方法。


此外,对于多分辨率,请使用底层可绘制对象的高度来计算半径。 - S.D.
http://www.networketiquette.net/do_not_use_all_caps.htm 现在,恢复正题,"not working" 是什么意思? - Simon
我把这段代码放在doDraw()里,但屏幕上没有显示任何内容。 canvas.save(); Path path = new Path(); path.addCircle(-10, 10, 200, Path.Direction.CW); canvas.drawTextOnPath("Hello", path, -10, -10, null); super.onDraw(canvas); canvas.restore(); - Rishabh Agrawal
我把这段代码放在doDraw()里了,是doDraw还是onDraw?你还在视图外添加了圆形。x = -10并且文本在路径之外。请编辑您的问题并附上您的onDraw方法。 - Simon
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Rishabh Agrawal

4
你需要像这样创建自己的 "View" 对象:
public class YourView extends View {
    private static final String YOUR_TEXT = "something cool";
    private Path _arc;

    private Paint _paintText;

    public YourView(Context context) {
      super(context);

      _arc = new Path();
      RectF oval = new RectF(50,100,200,250);;
      _arc.addArc(oval, -180, 200);
      _paintText = new Paint(Paint.ANTI_ALIAS_FLAG);
      _paintText.setStyle(Paint.Style.FILL_AND_STROKE);
      _paintText.setColor(Color.WHITE);
      _paintText.setTextSize(20f);

    }

    @Override
    protected void onDraw(Canvas canvas) {
      canvas.drawTextOnPath(YOUR_TEXT, _arc, 0, 20, _paintText);
      invalidate();
    }
}

然后将其用作您的TextView :) 希望这有所帮助


4
你可以查看Android SDK中的APIDemo源代码,该源代码位于SDK目录中。其中的示例“Graphics/Text Align”(文件名为TextAlign.java)展示了如何沿着路径显示文本:屏幕截图路径
然后您可以调整它来构建您的屏幕。

1
感谢您包含API示例中的图像。这样可以节省创建和运行项目的时间。 - AndroidGuy
https://github.com/appium/android-apidemos/blob/master/src/io/appium/android/apis/graphics/TextAlign.java - azurh
你能给我一个简短的描述吗? - Prince Dholakiya
您好,先生,我怎么在安卓上实现这种文本效果? - Prince Dholakiya

3
您可以通过使用自定义视图,在onDraw方法中实现它:
Path path = new Path();
path.addCircle(x, y, radius, Path.Direction.CW);
myCanvas.drawTextOnPath(myText, path, offset, 0, myPaint);

2
这里的x、y、path和offset是什么? - Pinkesh Darji

1

尝试以下代码...

onDraw(Canvas canvas){
 Path path = new Path();
 path.addArc(oval, startAngle, sweepAngle) 
 path.addArc(oval, 0, 180) 
 }

这可能有效....


-11

您不需要创建自定义视图。 找到正确的TypeFace,将其导入到您的项目中并设置给您的TextView

或使用微软办公室的艺术字功能,并将图片复制到您的项目中。

enter image description here


抱歉,伙计,这是不可能的,因为字体只能给你文本的样式,而不能给你弧形形状。 - Rishabh Agrawal
亲爱的,我想在运行时显示这种样式。我也可以在图像中使用这种样式。但我从不想要它。 - Rishabh Agrawal
这是一个与Android相关的问题,也是如何在代码中实现它,而不是使用Typeface的方式。 - Kenny Seyffarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接