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 Gradle Build Error:Some file crunching failed, see l
這篇文章主要介紹了Android Gradle Build Error:Some file crunching failed, see logs for details的快速解決方法的相關(guān)資料,需要的朋友可以參考下2016-10-10Android模擬器接收UDP數(shù)據(jù)包的若干問(wèn)題分析
這篇文章主要介紹了Android模擬器接收UDP數(shù)據(jù)包的若干問(wèn)題,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android模擬器接收UDP數(shù)據(jù)的使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-04-04Android實(shí)現(xiàn)BannerLayout圖文輪播功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)BannerLayout圖文輪播功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android PopupWindow被輸入法彈上去之后無(wú)法恢復(fù)原位的解決辦法
這篇文章主要介紹了Android PopupWindow被輸入法彈上去之后無(wú)法恢復(fù)原位的解決辦法,需要的朋友可以參考下2016-12-12android之ContentResolver與ContentProvider介紹
這篇文章主要介紹了android之ContentResolver與ContentProvider介紹,需要的朋友可以參考下2016-01-01Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧
這篇文章主要介紹了Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧的相關(guān)資料,需要的朋友可以參考下2015-12-12Android設(shè)置鈴聲實(shí)現(xiàn)代碼
這篇文章主要介紹了Android設(shè)置鈴聲實(shí)現(xiàn)代碼,以實(shí)例形式分析了Android中鈴聲設(shè)置的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-10-10Android實(shí)現(xiàn)打開各種文件的intent方法小結(jié)
這篇文章主要介紹了Android實(shí)現(xiàn)打開各種文件的intent方法,結(jié)合實(shí)例形式總結(jié)分析了Android針對(duì)HTML、圖片文件、pdf文件、文本文件、音頻文件、視頻文件等的intent打開方法,需要的朋友可以參考下2016-08-08Android 解決嵌套Fragment無(wú)法接收onCreateOptionsMenu事件的問(wèn)題
本文主要介紹Android Fragment無(wú)法接收onCreateOptionsMenu事件的問(wèn)題,這里給出解決辦法以及詳細(xì)代碼,希望能幫助有需要的小伙伴2016-07-07