自定義View在開(kāi)發(fā)中是經(jīng)常遇到的,例如一個(gè)×××燈的效果、或者自定義一個(gè)轉(zhuǎn)盤(pán)來(lái)顯示下載進(jìn)度的百分百比。今天把實(shí)現(xiàn)方式寫(xiě)下來(lái),下面是源碼部分:
為淮安等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及淮安網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、做網(wǎng)站、淮安網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
MainActivity:沒(méi)變動(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;
/**
* 畫(huà)筆工具
*/
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表示繪制過(guò)程的方式,paint表示畫(huà)筆對(duì)象
canvas.drawArc(rectF, 0, sweepAngle, true, paint);
}
class MyThread extends Thread {
@Override
public void run() {
super.run();
while (true) {
rx += 5;
// 如果字體移動(dòng)出屏幕以外,就讓字體從頭開(kāi)始
if (rx > getWidth()) {
rx = (int) (0 - paint.measureText("移動(dòng)字體"));
}
sweepAngle += 5;
// 如果角度大于360就讓圓從0度開(kāi)始重新繪制
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ì)象與畫(huà)筆對(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();分線程無(wú)效,要在主線程使用
}
}
}
/**
* 當(dāng)窗口銷(xiāo)毀的時(shí)候會(huì)調(diào)用此方法,用于關(guān)閉資源
*/
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
isdestroy = true;
System.out.println("onDetachedFromWindow");
}
}運(yùn)行效果:運(yùn)行起來(lái)是動(dòng)態(tài)的,我不會(huì)上傳動(dòng)態(tài)效果,想看效果的自己跑起來(lái)就可以了。

注意:這里的×××燈效果只是一種非常笨的方式,有更簡(jiǎn)單的辦法,我以后會(huì)介紹!
網(wǎng)頁(yè)題目:自定義View繪制圖像與移動(dòng)字體
瀏覽地址:http://chinadenli.net/article42/goiohc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、域名注冊(cè)、關(guān)鍵詞優(yōu)化、外貿(mào)建站、服務(wù)器托管、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)