如何使用textview或任何布局制作横幅或function区

嘿,我想制作一个类似于给定照片的横幅或function区文本视图或 使用xml或java的android中的 任何布局 我无法弄清楚如何做到这一点。
所以请帮我解决它真正需要的问题。
我想制作的自定义横幅

要创建这样的横幅你需要做这些事情

  1. 通过调整此代码创建一个倒置直角三角形的Shape drawable
  2. 将textView的背景设置为此形状
  3. 将textView Gravity更改为right / end align

这是一个简单的图像视图,角落里的文字横幅是我为自己使用而编写的。 相同的结构可以应用于任何类型的视图。

public class BannerImageView extends ImageView { private Paint mRibbonPaint; private Paint mTextPaint; private Paint mBoxPaint; private float mScale; private String mBannerText; public BannerImageView(Context context, AttributeSet attrs) { super(context, attrs); initPainters(attrs); } public BannerImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initPainters(attrs); } private void initPainters(AttributeSet attrs) { TypedArray attributes = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.BannerImageView, defStyleAttr, 0); mBannerText = attributes.getString(R.styleable.BannerImageView_label); mBoxPaint = new Paint(); int white = ContextCompat.getColor(getContext(), R.color.white); mBoxPaint.setColor(white); mBoxPaint.setAlpha(156); mRibbonPaint = new Paint(); mRibbonPaint.setColor(ContextCompat.getColor(getContext(), R.color.banner_color)); mRibbonPaint.setAntiAlias(true); mRibbonPaint.setStyle(Paint.Style.STROKE); mRibbonPaint.setStrokeCap(Paint.Cap.BUTT); mScale = getResources().getDisplayMetrics().density; mRibbonPaint.setStrokeWidth(dp(16)); mTextPaint = new Paint(); mTextPaint.setColor(white); mTextPaint.setTextSize( dp(12) ); } /** * Converts dp to px * @param dp * @return */ private float dp(float dp) { return dp * mScale + 0.5f; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if ( !TextUtils.isEmpty(mBannerText) ) { canvas.drawRect(0, 0, getRight(), getBottom(), mBoxPaint); canvas.drawLine(-dp(16), dp(64), dp(64), -dp(16), mRibbonPaint); canvas.save(); canvas.rotate(-45, 0, 0); canvas.drawText(mBannerText, -dp(24), dp(38), mTextPaint); canvas.restore(); } } 

然后在values / attrs.xml中声明要使用的额外属性

    

当然,您像往常一样在XML布局中使用,但请记住自定义属性的应用程序命名空间