Android實現(xiàn)左上角(其他邊角)傾斜的標(biāo)簽(環(huán)繞效果)效果
先上效果圖吧

由于項目需要實現(xiàn)這種左上角傾斜環(huán)繞的標(biāo)簽效果,所以自己嘗試著做一做,并記錄下來。
實現(xiàn)的思路大致如下圖:

主頁面的布局結(jié)構(gòu)如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="#fff"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="300dp"
android:layout_height="200dp"
android:background="#fff"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:background="#33B7F3"
android:elevation="2dp"></RelativeLayout>
<com.zc.labeldemo.LabelView
android:id="@+id/labelView"
android:layout_alignParentTop="true"
android:layout_width="75dp"
android:elevation="3dp"
android:layout_height="75dp"/>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
繪制傾斜標(biāo)簽的代碼如下:
package com.zc.labeldemo;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
/**
* @author wenchao
* @version 1.0.1
* @className LabelView
* @date 2019/9/20
* @description
*/
public class LabelView extends View {
/**
* 畫筆
*/
private Paint paint;
/**
* Path
*/
private Path path;
/**
* View寬度
*/
private float width;
/**
* View高度
*/
private float height;
/**
* 標(biāo)簽背景寬度
*/
private float labelWidth;
/**
* 標(biāo)簽折疊區(qū)域?qū)挾?
*/
private float pointWidth;
/**
* 標(biāo)簽折疊區(qū)域高度
*/
private float pointHeight;
/**
* 標(biāo)簽背景顏色
*/
private int labelColor;
/**
* 標(biāo)簽折疊區(qū)域背景顏色
*/
private int pointColor;
/**
* 中心點x坐標(biāo)
*/
private float centerX;
/**
* 中心點y坐標(biāo)
*/
private float centerY;
/**
* 標(biāo)簽文字內(nèi)容
*/
private String text;
/**
* 標(biāo)簽文字顏色
*/
private int textColor;
public LabelView(Context context) {
super(context);
}
public LabelView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
labelWidth = 120;
pointWidth = 10;
pointHeight = 17;
paint = new Paint();
path = new Path();
paint.setAntiAlias(true);
paint.setStrokeWidth(10);
setBackgroundColor(Color.TRANSPARENT);
labelColor = Color.parseColor("#EA6724");
pointColor = Color.parseColor("#C43200");
text = "測試內(nèi)容";
textColor = Color.WHITE;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
centerX = w/2;
centerY = h/2;
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
//畫標(biāo)簽區(qū)域背景上邊的折疊區(qū)域(小三角區(qū)域)
path.reset();
path.moveTo(width-pointWidth,0);
path.lineTo(width,pointHeight);
path.lineTo(width-pointWidth-26,pointHeight);
path.close();
paint.setColor(pointColor);
canvas.drawPath(path,paint);
//畫標(biāo)簽背景區(qū)域下邊的折疊區(qū)域
path.reset();
path.moveTo(0,height-pointWidth);
path.lineTo(pointHeight,height);
path.lineTo(pointHeight,height-pointWidth-26);
path.close();
paint.setColor(pointColor);
canvas.drawPath(path,paint);
//畫標(biāo)簽背景區(qū)域
path.reset();
paint.setColor(labelColor);
paint.setStyle(Paint.Style.FILL);
path.moveTo(width-labelWidth-pointWidth,0);
path.lineTo(width-pointWidth,0);
path.lineTo(0,height-pointWidth);
path.lineTo(0,height-labelWidth-pointWidth);
canvas.drawPath(path,paint);
//畫文字 逆時針選擇45度
canvas.rotate(-45,centerX,centerY);
//文字中心點橫坐標(biāo)
float textX = width / 2;
//文字中心點縱坐標(biāo)
float textY = (height-pointWidth-(labelWidth / 2f)) / 2f;
paint.setColor(textColor);
paint.setStyle(Paint.Style.FILL);
paint.setTextSize(38);
//設(shè)置文字居中繪制
paint.setTextAlign(Paint.Align.CENTER);
canvas.drawText(text,textX,textY,paint);
}
}
這個標(biāo)簽實現(xiàn)應(yīng)該是比較簡單的,而且多嵌套一層布局會消耗一定的資源,這里先簡單記錄一下實現(xiàn)的思路,后期有時間再做更改優(yōu)化。下面再貼一張其他邊角的效果圖吧:

總結(jié)
以上所述是小編給大家介紹的Android實現(xiàn)左上角(其他邊角)傾斜的標(biāo)簽(環(huán)繞效果)效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Android 判斷SIM卡是中國移動\中國聯(lián)通\中國電信(移動運營商)
本文給帶來兩種方法來判斷sim卡是屬于哪個運營商的,要實現(xiàn)此功能我們需要先獲取手機的imsi碼然后在判斷,對此功能感興趣的朋友一起通過本文學(xué)習(xí)吧2016-09-09
Android從網(wǎng)絡(luò)中獲得一張圖片并顯示在屏幕上的實例詳解
這篇文章主要介紹了Android從網(wǎng)絡(luò)中獲得一張圖片并顯示在屏幕上的實例詳解的相關(guān)資料,希望通過本文能幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
進度條ProgressBar及ProgressDialog(實例)
下面小編就為大家?guī)硪黄M度條ProgressBar及ProgressDialog(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
Android為textView設(shè)置setText的時候報錯的講解方案
今天小編就為大家分享一篇關(guān)于Android為textView設(shè)置setText的時候報錯的講解方案,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android編程實現(xiàn)禁止StatusBar下拉的方法
這篇文章主要介紹了Android編程實現(xiàn)禁止StatusBar下拉的方法,涉及Android StatusBarManager相關(guān)屬性控制操作技巧,需要的朋友可以參考下2017-08-08
Android實現(xiàn)循環(huán)輪播跑馬燈的效果
這篇文章主要介紹了為大家詳細(xì)介紹了如何通過Android實現(xiàn)循環(huán)輪播跑馬燈的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-05-05
Android開發(fā)實現(xiàn)廣告無限循環(huán)功能示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)廣告無限循環(huán)功能,結(jié)合完整實例形式分析了Android廣告圖片輪播功能的具體實現(xiàn)步驟與相關(guān)功能、布局等操作技巧,需要的朋友可以參考下2017-11-11
Android 2.3 撥號上網(wǎng)流程從源碼角度進行分析
SIM卡實現(xiàn)撥號上網(wǎng)功能之前需要設(shè)置一番,這些設(shè)置步驟究竟做了哪些事情呢?我們現(xiàn)在就從源碼的角度進行分析2013-01-01

