簡單的自定義控件

Ui圖

說明

當(dāng)拿到這張UI的時(shí)候就有寫個(gè)自定義控件的沖動,其中六邊形稍加復(fù)制,經(jīng)過分析得知可以自定義一個(gè)控制俱恶,只用給背景圖、圖標(biāo)范舀、和文字就可以合是,讓后加入點(diǎn)擊事件和帶圓點(diǎn)的控件就可以了。

正文

可以說重載onMeasure()锭环,onLayout()聪全,onDraw()三個(gè)函數(shù)構(gòu)建了自定義View的外觀形象。再加上onTouchEvent()等重載視圖的行為辅辩,可以構(gòu)建任何我們需要的可感知到的自定義View荔烧。

代碼很簡單

public class Hexagon extends ImageView {
    String text = "未付款";
    private Bitmap mAreaBitmap, logobitmap;
    private Paint paint;
    private Paint painttext;
    int textColor;
    float textSize;
    private Paint paintlogo;
    private Paint paintcircle;
    private int number = 10;
    private Paint txtPaint;

    public Hexagon(Context context) {
        this(context, null);
    }

    public Hexagon(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public Hexagon(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray mArray = context.obtainStyledAttributes(attrs, R.styleable.Hexagonattrs);
        Drawable areaBackground = mArray.getDrawable(R.styleable.Hexagonattrs_HexagonBackground);

        if (null != areaBackground) {
            // 設(shè)置了背景
            if (areaBackground instanceof BitmapDrawable) {
                // 設(shè)置了一張圖片
                mAreaBitmap = ((BitmapDrawable) areaBackground).getBitmap();
            }
        }

        Drawable logoBackground = mArray.getDrawable(R.styleable.Hexagonattrs_logoBackground);
        if (null != logoBackground) {
            // 設(shè)置了背景
            if (logoBackground instanceof BitmapDrawable) {
                // 設(shè)置了一張圖片
                logobitmap = ((BitmapDrawable) logoBackground).getBitmap();
            }
        }
        text = mArray.getString(R.styleable.Hexagonattrs_title);
        textColor = mArray.getColor(R.styleable.Hexagonattrs_titleColor, Color.parseColor("#FFFFFF"));
        textSize = mArray.getDimension(R.styleable.Hexagonattrs_titleSize, 90f);
        init();
    }

    private void init() {
        painttext = new Paint();
        painttext.setColor(textColor);
        painttext.setTextSize(textSize);


        paintcircle = new Paint();
        paintcircle.setAntiAlias(true);
        paintcircle.setColor(Color.RED);


        txtPaint = new Paint();
        txtPaint.setAntiAlias(true);
        txtPaint.setColor(Color.WHITE);
        txtPaint.setTextSize(30);
        //  txtPaint.setStyle(Paint.Style.STROKE); //設(shè)置畫筆為空心
        // txtPaint.setStrokeWidth(1); //設(shè)置線寬

    }


    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);


        //繪制背景
        if (mAreaBitmap != null) {
            Rect rect1 = new Rect(0, 0, mAreaBitmap.getWidth(), mAreaBitmap.getHeight());
            Rect rect2 = new Rect(0, 0, getWidth(), getHeight());
            canvas.drawBitmap(mAreaBitmap, rect1, rect2, null);
        }

        //繪制logo
        if (logobitmap != null) {
            Rect rect1 = new Rect(0, 0, logobitmap.getWidth(), logobitmap.getHeight());
            Rect rect2 = new Rect(getWidth() / 3, getHeight() / 10 * 3, getWidth() / 3 * 2, getHeight() / 10 * 6);
            canvas.drawBitmap(logobitmap, rect1, rect2, null);
        }


        //拿到字符串的寬度  X軸居中
        float stringWidth = painttext.measureText(text);
        float x = (getWidth() - stringWidth) / 2;
        canvas.drawText(text, x, getHeight() / 10 * 7, painttext);


        //繪制小圓點(diǎn)
        canvas.drawCircle(getWidth() / 10 * 7, getHeight() / 10 * 3, 30, paintcircle);



        //繪制小圓點(diǎn)中的文字
        if (number != 0) {
            canvas.drawText(number + "",
                    getWidth() / 10 * 7 - txtPaint.measureText(number + "") / 2,
                    getHeight() / 10 * 3 + (txtPaint.descent() - txtPaint.ascent()) / 2 - txtPaint.descent(),
                    txtPaint);
        }


    }

    //設(shè)置圓點(diǎn)中的數(shù)字
    public void setNumber(int number) {
        if (number > 99) {
            this.number = 99;
        } else {
            this.number = number;
        }
        invalidate();
    }
}

Xml引用

 <com.ac.myapplication.Hexagon
        android:layout_below="@+id/rl"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:id="@+id/hex"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:HexagonBackground="@mipmap/six"
        app:logoBackground="@mipmap/ff"
        app:title="未付款"
        app:titleColor="#fff"
        app:titleSize="10sp" />

attrs(通過自定義屬性 將圖片資源和文字大小通過XML設(shè)置將參數(shù)傳進(jìn)自定義六邊形中)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="Hexagonattrs">
        <attr name="HexagonBackground" format="reference" />
        <attr name="logoBackground" format="reference" />
        <attr name="title" format="string"/>
        <attr name="titleColor" format="color" />
        <attr name="titleSize" format="dimension" />
    </declare-styleable>
</resources>

單個(gè)六邊形的效果圖

效果圖

在MainActivity中的用法

public class MainActivity extends AppCompatActivity {
    private int nume = 10;
    private Hexagon hexagon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        hexagon = (Hexagon) findViewById(R.id.hex);

      //點(diǎn)擊事件
        hexagon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {吱七、
                  //設(shè)置數(shù)據(jù)
                hexagon.setNumber(++nume);
                Toast.makeText(MainActivity.this, "點(diǎn)擊了1", Toast.LENGTH_SHORT).show();
            }
        });
    }

    //自動隱藏虛擬按鍵和狀態(tài)欄
    @Override
    protected void onResume() {
        super.onResume();
        View view = getWindow().getDecorView();
        //自動隱藏虛擬按鍵和狀態(tài)欄
        view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                View.SYSTEM_UI_FLAG_FULLSCREEN |   View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

設(shè)置橫屏

 <activity android:name=".MainActivity"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

通過XML布局就會出現(xiàn)整體效果

效果圖

Mainactivity的XML代碼

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:layout_height="match_parent"
    android:background="#fff"
    tools:context="com.ac.myapplication.MainActivity">
    <RelativeLayout
        android:id="@+id/rl"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:background="#cb2f49">
        <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#cb2f49">
            <ImageView
                android:id="@+id/civ_header"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:src="@mipmap/blak"
                android:transitionName="sheredheader" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="返回"
                android:textColor="#fff"
                android:textSize="20sp" />
            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:background="@null"
                android:text="本地管理"
                android:textColor="#fff"
                android:textSize="20sp" />
        </android.support.v7.widget.Toolbar>
        <RelativeLayout
            android:layout_width="140dp"
            android:layout_height="130dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true">
            <com.ac.myapplication.ImageViewCircle
                android:id="@+id/im"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_centerVertical="true"
                android:src="@mipmap/ss" />
            <TextView
                android:id="@+id/tx"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="38dp"
                android:layout_toRightOf="@+id/im"
                android:text="張豪"
                android:textColor="#fff"
                android:textSize="20sp" />
            <TextView
                android:id="@+id/tx1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tx"
                android:layout_marginLeft="20dp"
                android:layout_toRightOf="@+id/im"
                android:text="Musrt"
                android:textColor="#fff"
                android:textSize="10sp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tx1"
                android:layout_marginLeft="20dp"
                android:layout_toRightOf="@+id/im"
                android:text="1865656858"
                android:textColor="#fff"
                android:textSize="10sp" />
        </RelativeLayout>
    </RelativeLayout>
    <com.ac.myapplication.Hexagon
        android:id="@+id/hex"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@+id/rl"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        app:HexagonBackground="@mipmap/six"
        app:logoBackground="@mipmap/ff"
        app:title="未付款"
        app:titleColor="#fff"
        app:titleSize="10sp" />
    <com.ac.myapplication.Hexagon
        android:id="@+id/hex1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@+id/rl"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:layout_toLeftOf="@+id/hex"
        app:HexagonBackground="@mipmap/six"
        app:logoBackground="@mipmap/ff"
        app:title="未付款"
        app:titleColor="#fff"
        app:titleSize="10sp" />
    <com.ac.myapplication.Hexagon
        android:id="@+id/hex2"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_below="@+id/rl"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@+id/hex"
        app:HexagonBackground="@mipmap/six"
        app:logoBackground="@mipmap/ff"
        app:title="未付款"
        app:titleColor="#fff"
        app:titleSize="10sp" />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/rl"
        android:layout_marginTop="55dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal">
            <com.ac.myapplication.Hexagon
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="10dp"
                app:HexagonBackground="@mipmap/six"
                app:logoBackground="@mipmap/ff"
                app:title="未付款"
                app:titleColor="#fff"
                app:titleSize="10sp" />
            <com.ac.myapplication.Hexagon
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="10dp"
                app:HexagonBackground="@mipmap/six"
                app:logoBackground="@mipmap/ff"
                app:title="未付款"
                app:titleColor="#fff"
                app:titleSize="10sp" />
        </LinearLayout>
    </RelativeLayout>
</RelativeLayout>

最后附上幾張資源文件的圖片

ss.jpg
six.png
ff
blak.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鹤竭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌景醇,老刑警劉巖臀稚,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異三痰,居然都是意外死亡吧寺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門散劫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稚机,“玉大人,你說我怎么就攤上這事获搏±堤酰” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵常熙,是天一觀的道長纬乍。 經(jīng)常有香客問我,道長裸卫,這世上最難降的妖魔是什么仿贬? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮墓贿,結(jié)果婚禮上茧泪,老公的妹妹穿的比我還像新娘。我一直安慰自己聋袋,他們只是感情好队伟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舱馅,像睡著了一般缰泡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上代嗤,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天棘钞,我揣著相機(jī)與錄音,去河邊找鬼干毅。 笑死宜猜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的硝逢。 我是一名探鬼主播姨拥,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼绅喉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叫乌?” 一聲冷哼從身側(cè)響起柴罐,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憨奸,沒想到半個(gè)月后革屠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡排宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年似芝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片板甘。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡党瓮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盐类,到底是詐尸還是另有隱情寞奸,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布傲醉,位于F島的核電站蝇闭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏硬毕。R本人自食惡果不足惜呻引,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吐咳。 院中可真熱鬧逻悠,春花似錦、人聲如沸韭脊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沪羔。三九已至饥伊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔫饰,已是汗流浹背琅豆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篓吁,地道東北人茫因。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像杖剪,于是被迫代替她去往敵國和親冻押。 傳聞我的和親對象是個(gè)殘疾皇子驰贷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 我們所用的所有控件都是直接或間接繼承自View的,所用的所有布局都是直接或間接繼承自ViewGroup的.View...
    隨心者隨心行閱讀 291評論 0 0
  • 本文出自 “阿敏其人” 簡書博客洛巢,轉(zhuǎn)載或引用請注明出處括袒。 開發(fā)的時(shí)候,因?yàn)闃I(yè)務(wù)需求或者封裝需要稿茉,我們會進(jìn)行自定義控...
    阿敏其人閱讀 6,516評論 2 48
  • 目標(biāo): 1箱熬、掌握自定義view的流程2、掌握自定義view的三個(gè)方法3狈邑、掌握自定義view實(shí)現(xiàn)方式4、掌握自定義v...
    Anwfly閱讀 1,729評論 2 7
  • 目標(biāo): 1蚤认、掌握自定義view的流程2米苹、掌握自定義view的三個(gè)方法3、掌握自定義view實(shí)現(xiàn)方式4砰琢、掌握自定義v...
    煙刺痛了眼_a1b7閱讀 371評論 0 0
  • 目標(biāo): 1蘸嘶、掌握自定義view的流程2、掌握自定義view的三個(gè)方法3陪汽、掌握自定義view實(shí)現(xiàn)方式4训唱、掌握自定義v...
    小慧sir閱讀 119評論 0 0