Android自定義View過(guò)程解析
Android自定義的view,主要是繼承view,然后實(shí)現(xiàn)ondraw這個(gè)方法,來(lái)進(jìn)行繪制。
- 1. 編寫自己的自定義view
- 2. 加入邏輯線程
- 3. 提取和封裝自定義view
- 4. 利用xml中定義樣式來(lái)影響顯示效果
一、編寫自定義的view
1.在xml中使用自己的view
<!-- 可以使用view的公共屬性,例如背景 --> <com.niuli.view.MyView android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" />
2.通過(guò)繼承view,然后實(shí)現(xiàn)ondraw來(lái)實(shí)現(xiàn)方法
public class MyView extends View {
Bitmap bitmap;
public MyView(Context context) {
super(context);
/**
* getResources()可以獲取當(dāng)前資源內(nèi)的資源
*/
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
}
/**
* 繪制是通過(guò)Canvas來(lái)承載,其就相當(dāng)于一塊畫布
* 更多的學(xué)習(xí)將在不斷的做小東西中更新
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/**
* Paint相當(dāng)于一只畫筆,可以畫文字,幾何圖形,bit圖片等
*/
Paint paint = new Paint();
//設(shè)置繪制的顏色,是否空心之類的都是對(duì)畫筆的設(shè)計(jì)
paint.setColor(Color.BLUE);
//繪畫文字
paint.setTextSize(30);
canvas.drawText("這是一個(gè)自定義view", 0, 30, paint);
//繪畫直線
canvas.drawLine(0, 60, 100, 60, paint);
//繪畫圓角矩形方法之一
//設(shè)置空心
paint.setStyle(paint.getStyle().STROKE);
RectF rec = new RectF(0, 90, 100, 190);
canvas.drawRoundRect(rec, 20, 20, paint);
//繪制圖片
canvas.drawBitmap(bitmap, 0, 350, paint);
}
}
效果

二、自定義的view+線程的使用控制
繪制文字,和圓形,通過(guò)線程控制使得其能在屏幕中移動(dòng)
public class MyViewtwo extends View {
//定義畫筆
private Paint paint = new Paint();
private int x;
private float sweepAngle;
private control thread;
private Random random = new Random();
public MyViewtwo(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyViewtwo(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
paint.setTextSize(80);
//繪制文字
canvas.drawText("七夕快樂(lè)", x, 70, paint);
//繪制圖形
RectF rect = new RectF(0 ,80 ,100, 160);
canvas.drawArc(rect, 0, sweepAngle, true, paint);
//啟動(dòng)線程
if (thread ==null) {
thread = new control();
thread.start();
}
}
public class control extends Thread{
@Override
public void run() {
while(true){
x +=3;
sweepAngle++;
if (x>getWidth()) {
x = (int) (0 - paint.measureText("七夕快樂(lè)"));
}
//控制圓的的旋轉(zhuǎn)
if (sweepAngle>360) {
sweepAngle = 0;
}
//設(shè)置畫筆顏色
paint.setARGB(255, random.nextInt(255), random.nextInt(255), random.nextInt(255));
//相當(dāng)于刷新畫布
postInvalidate();
try {
sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
效果

三、封裝移動(dòng)程序,模塊化思想
封裝主要是使用抽象方法,子類繼承后只要實(shí)現(xiàn)這些方法即可運(yùn)行起來(lái),大大簡(jiǎn)化了程序
public abstract class MyViewtwo extends View {
private control thread;
public MyViewtwo(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyViewtwo(Context context) {
super(context);
}
//封裝,構(gòu)造畫面,子類繼承后需要重寫
protected abstract void drawsub(Canvas canvas);
@Override
protected final void onDraw(Canvas canvas) {
//啟動(dòng)線程
if (thread ==null) {
thread = new control();
thread.start();
}else {
drawsub(canvas);
}
}
//封裝移動(dòng)方法,子類繼承后需要重寫
protected abstract void move();
public class control extends Thread{
@Override
public void run() {
while(true){
move();
//相當(dāng)于刷新畫布
postInvalidate();
try {
sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
四、使用xml中定義樣式影響顯示效果
1、第一步就是在value文件夾中建立自己的樣式文件
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="NumText"> <attr name="lineNum" format="integer"/> <attr name="xScroll" format="boolean" /> </declare-styleable> </resources>
2、xml中先要加入命名空間,然后就可以直接使用屬性
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:nt="http://schemas.android.com/apk/res/com.jikexueyuan.myview" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" > <com.jikexueyuan.myview.v4.NumText android:layout_width="match_parent" android:layout_height="match_parent" nt:lineNum="6" nt:xScroll="true"/> </FrameLayout>
3、代碼中要有相應(yīng)的解析xml中定義的這個(gè)元素
public NumText(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NumText);
lineNum = ta.getInt(R.styleable.NumText_lineNum, 1);
xScroll = ta.getBoolean(R.styleable.NumText_xScroll, false);
ta.recycle();
}
主要就是利用以上方法和xml中定義元素值進(jìn)行曝光相關(guān)聯(lián)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- Android 自定義View的使用介紹
- Android自定義View設(shè)定到FrameLayout布局中實(shí)現(xiàn)多組件顯示的方法 分享
- Android自定義View實(shí)現(xiàn)廣告信息上下滾動(dòng)效果
- Android自定義View實(shí)現(xiàn)帶數(shù)字的進(jìn)度條實(shí)例代碼
- Android自定義View之酷炫圓環(huán)(二)
- Android自定義view制作絢麗的驗(yàn)證碼
- Android自定義View之酷炫數(shù)字圓環(huán)
- Android自定義View軟鍵盤實(shí)現(xiàn)搜索
- 實(shí)例講解Android中的View類以及自定義View控件的方法
- Android自定義View實(shí)現(xiàn)水面上漲效果
相關(guān)文章
Android音頻編輯之音頻轉(zhuǎn)換PCM與WAV
這篇文章主要為大家詳細(xì)介紹了Android音頻編輯之音頻轉(zhuǎn)換PCM與WAV,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Android UI控件之ImageSwitcher實(shí)現(xiàn)圖片切換效果
這篇文章主要為大家詳細(xì)介紹了Android UI控件之ImageSwitcher實(shí)現(xiàn)圖片切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android ListView分頁(yè)簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了Android ListView分頁(yè)簡(jiǎn)單實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android BottomNavigationBar底部導(dǎo)航控制器使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android BottomNavigationBar底部導(dǎo)航控制器使用方法,感興趣的小伙伴們可以參考一下2016-03-03
Android源碼學(xué)習(xí)之單例模式應(yīng)用及優(yōu)點(diǎn)介紹
動(dòng)態(tài)確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例這就是Android單例模式應(yīng)用,接下來(lái)詳細(xì)介紹,有需求的朋友可以參考下2013-01-01
解決Android從相冊(cè)中獲取圖片出錯(cuò)圖片卻無(wú)法裁剪問(wèn)題的方法
這篇文章主要介紹了解決Android從相冊(cè)中獲取圖片出錯(cuò)圖片卻無(wú)法裁剪問(wèn)題的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Android AIDL實(shí)現(xiàn)兩個(gè)APP間的跨進(jìn)程通信實(shí)例
這篇文章主要為大家詳細(xì)介紹了Android AIDL實(shí)現(xiàn)兩個(gè)APP間的跨進(jìn)程通信實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
在Android中實(shí)現(xiàn)浮窗并添加吸邊效果的代碼示例
在 Android 中實(shí)現(xiàn)浮窗(懸浮窗)并添加吸邊效果,可以使用 WindowManager 來(lái)管理浮窗視圖,并通過(guò)觸摸事件來(lái)實(shí)現(xiàn)吸邊效果,以下是一個(gè)示例,展示如何創(chuàng)建一個(gè)浮窗并實(shí)現(xiàn)吸邊效果,需要的朋友可以參考下2025-02-02
自定義一個(gè)theme在不同的sdk環(huán)境下繼承不同的值
可能很多在高版本下編繹apk的同學(xué),可能都曾有和我一樣的困惑,就是如何讓低版本的用戶也能有高版本的體驗(yàn)?zāi)?/div> 2013-01-01
Android實(shí)現(xiàn)讀寫USB串口數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)讀寫USB串口數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09最新評(píng)論

