Java 如何在android中绘制包含文本的多边形

Java 如何在android中绘制包含文本的多边形,java,android,xml,android-drawable,Java,Android,Xml,Android Drawable,我需要画这样的视图,里面有文本。 图形的文字和颜色必须是可变的。 最好的方法是什么 一旦您想要绘制动态图形,您就进入了手工绘制领域,或者使用一些第三方库,这些库将为您简单地完成这项工作 幸运的是,自己做这件事很简单。可以使用Canvas对象绘制多边形,如本例所示,可以从以下位置绘制: 有两种方法可以将您的Canvas附加到屏幕上显示的某个UI对象,主要的方法在文档页面中描述,例如 渲染到位图,然后添加到例如图像视图 扩展UI小部件,例如视图,并在onDraw方法中更新它 要更改多边形,只需将线条

我需要画这样的视图,里面有文本。 图形的文字和颜色必须是可变的。
最好的方法是什么

一旦您想要绘制动态图形,您就进入了手工绘制领域,或者使用一些第三方库,这些库将为您简单地完成这项工作

幸运的是,自己做这件事很简单。可以使用
Canvas
对象绘制多边形,如本例所示,可以从以下位置绘制:

有两种方法可以将您的
Canvas
附加到屏幕上显示的某个UI对象,主要的方法在文档页面中描述,例如

  • 渲染到
    位图
    ,然后添加到例如
    图像视图
  • 扩展UI小部件,例如
    视图
    ,并在
    onDraw
    方法中更新它
  • 要更改多边形,只需将
    线条中的x和y点更改为上面的方法以及
    绘制中的颜色即可。如果需要,请确保进行更新。如果选择方法1,则可能需要手动重新渲染为
    位图
    ,如果选择方法2,则需要在
    视图上调用
    无效

    对于要显示在多边形内部的文本,也可以使用drawText方法在
    画布上绘制,或者在布局XML中的
    视图
    上方放置一个
    文本视图
    。如果您希望文本严格位于多边形内部,显然必须进行一些放置计算,可能还需要断线和截断


    另请参见手册页。

    您可以使用如下三角形图像来实现:

     <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FF2323"
        android:drawableLeft="@drawable/triangle"
        android:gravity="center"
        android:paddingRight="10dp"
        android:text="In Process"
        android:textColor="@android:color/white" />
    
    textView.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(getResources(), getResizedBitmap(this, R.drawable.triangle, 64, 64)), null, null, null);
    
    换成最适合你的

    下面是调整大小的方法:

    public static Bitmap getResizedBitmap(Context activity,int imgid,int width,int height) {
        Bitmap bMap = BitmapFactory.decodeResource(activity.getResources(),imgid);
        Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, width,height, true);
        return bMapScaled;
    }
    

    它只是一个9补丁,用作TextView的背景。要更改颜色,请参见以下答案:
    public static Bitmap getResizedBitmap(Context activity,int imgid,int width,int height) {
        Bitmap bMap = BitmapFactory.decodeResource(activity.getResources(),imgid);
        Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, width,height, true);
        return bMapScaled;
    }