Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android custom user interface

r

I am creating an Android application. I am new to android. I want to create a label like in the image below. Here is the below code that I have tried. I have labels over the images. Any help will be appreciated. Thanks

   <FrameLayout
        android:layout_weight="1"
        android:layout_gravity="center"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/fl_bg">

        <ImageView
            android:layout_gravity="center"
            android:id="@+id/iv_avatar"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:contentDescription="@string/app_name"
            android:src="@drawable/jouer"
            android:scaleType="fitCenter"/>

        <LinearLayout
            android:gravity="center"
            android:id="@+id/ll_winner_label"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_marginTop="20dp"
                android:id="@+id/tv_rank"
                android:text="1"
                android:layout_gravity="top"
                android:rotation="120"
                android:background="@color/label_center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>


            <TextView
                android:layout_marginTop="20dp"
                android:id="@+id/tv_earned_amount"
                android:text="5$"
                android:rotation="120"
                android:background="@color/label_center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />


        </LinearLayout>


    </FrameLayout>
like image 781
Vengat Avatar asked Jun 04 '19 10:06

Vengat


People also ask

Can you customize Android UI?

The Android UI model is inherently customizable, offering the means of Android customization, testing, and the ability to create custom UI components in various ways: Inherit an existing component (i.e. TextView , ImageView , etc.), and add/override needed functionality.

Does Android have a GUI?

Android applications use classes in the Java language to implement various aspects of Graphical User Interface (GUI) functionality. Developers can make use of these classes to create standard behavior within their apps. As well as Java class files, Android applications use XML data to declare screen layouts.


2 Answers

make changes in your code as follows

    <ImageView
        android:layout_gravity="center"
        android:id="@+id/iv_avatar"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:contentDescription="@string/app_name"
        android:src="@mipmap/ic_launcher"
        android:scaleType="fitCenter"/>

    <LinearLayout
        android:gravity="center"
        android:id="@+id/ll_winner_label"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_marginTop="-20dp"
            android:layout_marginStart="-20dp"
            android:id="@+id/tv_rank"
            android:text="1"
           android:layout_alignParentTop="true"
            android:rotation="120"
            android:background="#000"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>


        <TextView
            android:layout_below="@id/tv_rank"
            android:layout_marginTop="40dp"
         android:layout_marginStart="-30dp"
            android:layout_marginEnd="0dp"
            android:id="@+id/tv_earned_amount"
            android:text="5$"
            android:rotation="120"
            android:background="#000"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />


    </LinearLayout>


</FrameLayout>

result result of above layout

like image 200
akshay_shahane Avatar answered Oct 29 '22 19:10

akshay_shahane


public class LabelViewHelper {

    private static final int LEFT_TOP = 1;
    private static final int RIGHT_TOP = 2;
    private static final int LEFT_BOTTOM = 3;
    private static final int RIGHT_BOTTOM = 4;

    private static final int DEFAULT_DISTANCE = 40;
    private static final int DEFAULT_HEIGHT = 20;
    private static final int DEFAULT_STROKE_WIDTH = 1;
    private static final int DEFAULT_TEXT_SIZE = 14;
    private static final int DEFAULT_BACKGROUND_COLOR = 0x9F27CDC0;
    private static final int DEFAULT_STROKE_COLOR = 0xFFFFFFFF;
    private static final int DEFAULT_TEXT_COLOR = 0xFFFFFFFF;
    private static final int DEFAULT_ORIENTATION = LEFT_TOP;
    private static final int DEFAULT_TEXT_STYLE = 0;

    private int distance;
    private int height;
    private int strokeWidth;
    private String text;
    private int backgroundColor;
    private int strokeColor;
    private int textSize;
    private int textStyle;
    private int textColor;
    private boolean visual;
    private int orientation;

    private Paint rectPaint;
    private Paint rectStrokePaint;
    // simulator
    private Path rectPath;
    private Path textPath;
    private Paint textPaint;
    private Rect textBound;

    private Context context;
    private int alpha;

    public LabelViewHelper(Context context, AttributeSet attrs, int defStyleAttr) {

        this.context = context;

        TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.LabelView, defStyleAttr, 0);
        distance = attributes.getDimensionPixelSize(R.styleable.LabelView_label_distance, dip2Px(DEFAULT_DISTANCE));
        height = attributes.getDimensionPixelSize(R.styleable.LabelView_label_height, dip2Px(DEFAULT_HEIGHT));
        strokeWidth = attributes.getDimensionPixelSize(R.styleable.LabelView_label_strokeWidth, dip2Px(DEFAULT_STROKE_WIDTH));
        text = attributes.getString(R.styleable.LabelView_label_text);
        backgroundColor = attributes.getColor(R.styleable.LabelView_label_backgroundColor, DEFAULT_BACKGROUND_COLOR);
        strokeColor = attributes.getColor(R.styleable.LabelView_label_strokeColor, DEFAULT_STROKE_COLOR);
        textSize = attributes.getDimensionPixelSize(R.styleable.LabelView_label_textSize, dip2Px(DEFAULT_TEXT_SIZE));
        textStyle = attributes.getInt(R.styleable.LabelView_label_textStyle, DEFAULT_TEXT_STYLE);
        textColor = attributes.getColor(R.styleable.LabelView_label_textColor, DEFAULT_TEXT_COLOR);
        visual = attributes.getBoolean(R.styleable.LabelView_label_visual, true);
        orientation = attributes.getInteger(R.styleable.LabelView_label_orientation, DEFAULT_ORIENTATION);
        attributes.recycle();

        rectPaint = new Paint();
        rectPaint.setDither(true);
        rectPaint.setAntiAlias(true);
        rectPaint.setStyle(Paint.Style.FILL);

        rectStrokePaint = new Paint();
        rectStrokePaint.setDither(true);
        rectStrokePaint.setAntiAlias(true);
        rectStrokePaint.setStyle(Paint.Style.STROKE);

        rectPath = new Path();
        rectPath.reset();

        textPath = new Path();
        textPath.reset();

        textPaint = new Paint();
        textPaint.setDither(true);
        textPaint.setAntiAlias(true);
        textPaint.setStrokeJoin(Paint.Join.ROUND);
        textPaint.setStrokeCap(Paint.Cap.SQUARE);

        textBound = new Rect();
    }

    public void onDraw(Canvas canvas, int measuredWidth, int measuredHeight) {
        if (!visual || text == null) {
            return;
        }

        float actualDistance = distance + height / 2;
        calcOffset(measuredWidth, measuredHeight);

        rectPaint.setColor(backgroundColor);
        if (alpha != 0) {
            rectPaint.setAlpha(alpha);
        }

        rectStrokePaint.setColor(strokeColor);
        rectStrokePaint.setStrokeWidth(strokeWidth);

        canvas.drawPath(rectPath, rectPaint);
        canvas.drawPath(rectPath, rectStrokePaint);

        textPaint.setTextSize(textSize);
        textPaint.setColor(textColor);
        textPaint.getTextBounds(text, 0, text.length(), textBound);
        textPaint.setTypeface(Typeface.defaultFromStyle(textStyle));

        float begin_w_offset = (1.4142135f * actualDistance) / 2 - textBound.width() / 2;
        if (begin_w_offset < 0) begin_w_offset = 0;

        canvas.drawTextOnPath(text, textPath, begin_w_offset, textBound.height() / 2, textPaint);
    }

    private void calcOffset(int measuredWidth, int measuredHeight) {
        float startPosX = measuredWidth - distance - height;
        float endPosX = measuredWidth;
        float startPosY = measuredHeight - distance - height;
        float endPosY = measuredHeight;

        float middle = height/2;

        switch (orientation) {
            case 1: // LEFT_TOP

                rectPath.reset();
                rectPath.moveTo(0, distance);
                rectPath.lineTo(distance, 0);
                rectPath.lineTo(distance + height, 0);
                rectPath.lineTo(0, distance + height);
                rectPath.close();

                textPath.reset();
                textPath.moveTo(0, distance + middle);
                textPath.lineTo(distance + middle, 0);
                textPath.close();

                break;
            case 2: // RIGHT_TOP

                rectPath.reset();
                rectPath.moveTo(startPosX, 0);
                rectPath.lineTo(startPosX + height, 0);
                rectPath.lineTo(endPosX, distance);
                rectPath.lineTo(endPosX, distance + height);
                rectPath.close();

                textPath.reset();
                textPath.moveTo(startPosX + middle, 0);
                textPath.lineTo(endPosX, distance + middle);
                textPath.close();

                break;
            case 3: // LEFT_BOTTOM

                rectPath.reset();
                rectPath.moveTo(0, startPosY);
                rectPath.lineTo(distance + height, endPosY);
                rectPath.lineTo(distance, endPosY);
                rectPath.lineTo(0, startPosY + height);
                rectPath.close();

                textPath.reset();
                textPath.moveTo(0, startPosY + middle);
                textPath.lineTo(distance + middle, endPosY);
                textPath.close();

                break;
            case 4: // RIGHT_BOTTOM

                rectPath.reset();
                rectPath.moveTo(startPosX, endPosY);
                rectPath.lineTo(measuredWidth, startPosY);
                rectPath.lineTo(measuredWidth, startPosY + height);
                rectPath.lineTo(startPosX + height, endPosY);
                rectPath.close();

                textPath.reset();
                textPath.moveTo(startPosX + middle, endPosY);
                textPath.lineTo(endPosX, startPosY + middle);
                textPath.close();

                break;
        }
    }

    private int dip2Px(float dip) {
        return (int) (dip * context.getResources().getDisplayMetrics().density + 0.5f);
    }

    private int px2Dip(float px) {
        return (int) (px / context.getResources().getDisplayMetrics().density + 0.5f);
    }

    public void setLabelHeight(View view, int height) {
        if (this.height != dip2Px(height)) {
            this.height = dip2Px(height);
            view.invalidate();
        }
    }

    public int getLabelHeight() {
        return px2Dip(this.height);
    }

    public void setLabelDistance(View view, int distance) {
        if (this.distance != dip2Px(distance)) {
            this.distance = dip2Px(distance);
            view.invalidate();
        }
    }

    public int getLabelStrokeWidth() {
        return px2Dip(this.strokeWidth);
    }

    public void setLabelStrokeWidth(View view, int strokeWidth) {
        if (this.strokeWidth != dip2Px(strokeWidth)) {
            this.strokeWidth = dip2Px(strokeWidth);
            view.invalidate();
        }
    }

    public int getLabelDistance() {
        return px2Dip(this.distance);
    }

    public boolean isLabelVisual() {
        return visual;
    }

    public void setLabelVisual(View view, boolean visual) {
        if (this.visual != visual) {
            this.visual = visual;
            view.invalidate();
        }
    }

    public int getLabelOrientation() {
        return orientation;
    }

    public void setLabelOrientation(View view, int orientation) {
        if (this.orientation != orientation && orientation <= 4 && orientation >= 1) {
            this.orientation = orientation;
            view.invalidate();
        }
    }

    public int getLabelTextColor() {
        return textColor;
    }

    public void setLabelTextColor(View view, int textColor) {
        if (this.textColor != textColor) {
            this.textColor = textColor;
            view.invalidate();
        }
    }

    public int getLabelBackgroundColor() {
        return backgroundColor;
    }

    public void setLabelBackgroundColor(View view, int backgroundColor) {
        if (this.backgroundColor != backgroundColor) {
            this.backgroundColor = backgroundColor;
            view.invalidate();
        }
    }

    public int getLabelStrokeColor() {
        return strokeColor;
    }

    public void setLabelStrokeColor(View view, int strokeColor) {
        if (this.strokeColor != strokeColor) {
            this.strokeColor = strokeColor;
            view.invalidate();
        }
    }


    public void setLabelBackgroundAlpha(View view, int alpha) {
        if (this.alpha != alpha) {
            this.alpha = alpha;
            view.invalidate();
        }
    }

    public String getLabelText() {
        return text;
    }

    public void setLabelText(View view, String text) {
        if (this.text == null || !this.text.equals(text)) {
            this.text = text;
            view.invalidate();
        }
    }

    public int getLabelTextSize() {
        return px2Dip(this.textSize);
    }

    public void setLabelTextSize(View view, int textSize) {
        if (this.textSize != textSize) {
            this.textSize = textSize;
            view.invalidate();
        }
    }

    public int getLabelTextStyle(){
        return textStyle;
    }

    public void setLabelTextStyle(View view, int textStyle){
        if(this.textStyle == textStyle) return;
        this.textStyle = textStyle;
        view.invalidate();
    }
}
like image 41
Vengat Avatar answered Oct 29 '22 18:10

Vengat