Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用textview或任何布局制作横幅或功能区_Java_Android_Xml_Textview_Banner - Fatal编程技术网

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

Java 如何使用textview或任何布局制作横幅或功能区,java,android,xml,textview,banner,Java,Android,Xml,Textview,Banner,嘿,我想使用xml或java在android中使用textview或任何布局制作一个类似于给定照片的横幅或功能区。我想不出怎么做。 所以请帮我解决它真正需要的问题。 要创建这样的横幅,您需要执行以下操作 通过调整创建可绘制的倒直角三角形形状 将textView的背景设置为此形状 将textView重力更改为右/端对齐 这是一个简单的图像视图,在角落里有一个文本横幅,我是为自己写的。相同的结构可以应用于任何类型的视图 public class BannerImageView extends Ima

嘿,我想使用xml或java在android中使用textview或任何布局制作一个类似于给定照片的横幅或功能区。我想不出怎么做。
所以请帮我解决它真正需要的问题。

要创建这样的横幅,您需要执行以下操作

  • 通过调整创建可绘制的倒直角三角形形状
  • 将textView的背景设置为此形状
  • 将textView重力更改为右/端对齐

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

    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" />
    
    
    
    这是一个背景可绘制的文本视图…什么是defStyleAttr???它应该是您想要的属性(样式)的标识符-它实际上对这个答案并不重要-设置为零后请参见此处,它也不起作用