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

时间:2016-01-04 18:36:47

标签: java android xml textview banner

嘿我想使用xml或java在 android中使用 textview或任何布局制作类似于给定照片的横幅或功能区。我无法弄清楚如何做到这一点。
所以请帮我解决它真正需要的问题 Custom Banner that i want to make

2 个答案:

答案 0 :(得分:1)

创建一个类似你需要做这些事情的横幅

  1. 通过调整this code
  2. 创建一个倒置直角三角形的Shape drawable
  3. 将textView的背景设置为此形状
  4. 将textView Gravity更改为右/右对齐

答案 1 :(得分:0)

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

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中声明要使用的额外属性

<declare-styleable name="BannerImageView">
    <attr name="label" format="string"/>
</declare-styleable>

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

<com.my.package.BannerImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:label="Sold Out" />