您好,登錄后才能下訂單哦!
自定義View在開發(fā)中是經(jīng)常遇到的,例如一個(gè)×××燈的效果、或者自定義一個(gè)轉(zhuǎn)盤來顯示下載進(jìn)度的百分百比。今天把實(shí)現(xiàn)方式寫下來,下面是源碼部分:
MainActivity:沒變動(dòng)
import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
主布局:只增加了一個(gè)自定義View
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.myview.MineView android:layout_width="wrap_content" android:layout_height="wrap_content" > </com.example.myview.MineView> </RelativeLayout>
自定義View:
import java.util.Random; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import android.os.SystemClock; import android.util.AttributeSet; import android.view.View; public class MineView extends View { /** * 字體移動(dòng)的X坐標(biāo) */ private int rx = 0; /** * 畫筆工具 */ private Paint paint; /** * 創(chuàng)建線程對(duì)象,用于循環(huán)延遲執(zhí)行命令 */ private MyThread t; /** * 0表示圓的left,60表示圓的top,100表示圓的right,160表示圓的bottom */ private RectF rectF = new RectF(0, 60, 100, 160); /** * 表示區(qū)間角度 */ private float sweepAngle; /** * 創(chuàng)建隨機(jī)數(shù)對(duì)象 */ private Random random; /** * isdestroy表示該Activity是否已經(jīng)結(jié)束 */ private boolean isdestroy = false; public MineView(Context context, AttributeSet attrs) { super(context, attrs); System.out.println("構(gòu)造器"); paint = new Paint(); random = new Random(); //抗鋸齒,否則圖像會(huì)很難看 paint.setAntiAlias(true); if (t == null) { t = new MyThread(); t.start(); } } public MineView(Context context) { super(context); System.out.println("構(gòu)造器"); paint = new Paint(); paint.setAntiAlias(true); if (t == null) { t = new MyThread(); t.start(); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setTextSize(30); // rx表示移動(dòng)字體的x坐標(biāo) canvas.drawText("移動(dòng)字體", rx, 30, paint); // rectF表示圓的對(duì)象,0表示起始角度,sweepAngle表示區(qū)間角度,true和false表示繪制過程的方式,paint表示畫筆對(duì)象 canvas.drawArc(rectF, 0, sweepAngle, true, paint); } class MyThread extends Thread { @Override public void run() { super.run(); while (true) { rx += 5; // 如果字體移動(dòng)出屏幕以外,就讓字體從頭開始 if (rx > getWidth()) { rx = (int) (0 - paint.measureText("移動(dòng)字體")); } sweepAngle += 5; // 如果角度大于360就讓圓從0度開始重新繪制 if (sweepAngle > 360) { sweepAngle = 0; } // 讓顏色從0-255隨機(jī)選擇 int r = random.nextInt(256); int g = random.nextInt(256); int b = random.nextInt(256); // 分別表示:透明度(0~255)、紅、綠、藍(lán) paint.setARGB(255, r, g, b); /** * 判斷Activity是否已經(jīng)退出,如果退出則isdestroy為true,那么立刻讓線程對(duì)象與畫筆對(duì)象為空,并且break, * 否則會(huì)造成內(nèi)存溢出,此辦法必須在此處使用,否則會(huì)造成空指針的BUG。 */ if (isdestroy) { if (t != null) { t = null; } if (paint != null) { paint = null; } break; } // 睡眠 SystemClock.sleep(50); // 可以讓ondraw方法重新執(zhí)行 postInvalidate(); // invalidate();分線程無效,要在主線程使用 } } } /** * 當(dāng)窗口銷毀的時(shí)候會(huì)調(diào)用此方法,用于關(guān)閉資源 */ @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); isdestroy = true; System.out.println("onDetachedFromWindow"); } }
運(yùn)行效果:運(yùn)行起來是動(dòng)態(tài)的,我不會(huì)上傳動(dòng)態(tài)效果,想看效果的自己跑起來就可以了。
注意:這里的×××燈效果只是一種非常笨的方式,有更簡(jiǎn)單的辦法,我以后會(huì)介紹!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。