中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

自定義View繪制圖像與移動字體

發布時間:2020-07-14 14:18:08 來源:網絡 閱讀:647 作者:IT學無止境 欄目:移動開發

自定義View在開發中是經常遇到的,例如一個×××燈的效果、或者自定義一個轉盤來顯示下載進度的百分百比。今天把實現方式寫下來,下面是源碼部分:

MainActivity:沒變動

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);
    }
}

主布局:只增加了一個自定義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 {

    /**
     * 字體移動的X坐標
     */
    private int rx = 0;
    /**
     * 畫筆工具
     */
    private Paint paint;
    /**
     * 創建線程對象,用于循環延遲執行命令
     */
    private MyThread t;
    /**
     * 0表示圓的left,60表示圓的top,100表示圓的right,160表示圓的bottom
     */
    private RectF rectF = new RectF(0, 60, 100, 160);
    /**
     * 表示區間角度
     */
    private float sweepAngle;
    /**
     * 創建隨機數對象
     */
    private Random random;
    /**
     * isdestroy表示該Activity是否已經結束
     */
    private boolean isdestroy = false;

    public MineView(Context context, AttributeSet attrs) {
        super(context, attrs);
        System.out.println("構造器");
        paint = new Paint();
        random = new Random();
        //抗鋸齒,否則圖像會很難看
        paint.setAntiAlias(true);
        if (t == null) {
            t = new MyThread();
            t.start();
        }
    }

    public MineView(Context context) {
        super(context);
        System.out.println("構造器");
        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表示移動字體的x坐標
        canvas.drawText("移動字體", rx, 30, paint);
        // rectF表示圓的對象,0表示起始角度,sweepAngle表示區間角度,true和false表示繪制過程的方式,paint表示畫筆對象
        canvas.drawArc(rectF, 0, sweepAngle, true, paint);
    }

    class MyThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (true) {
                rx += 5;
                // 如果字體移動出屏幕以外,就讓字體從頭開始
                if (rx > getWidth()) {
                    rx = (int) (0 - paint.measureText("移動字體"));
                }

                sweepAngle += 5;
                // 如果角度大于360就讓圓從0度開始重新繪制
                if (sweepAngle > 360) {
                    sweepAngle = 0;
                }
                // 讓顏色從0-255隨機選擇
                int r = random.nextInt(256);
                int g = random.nextInt(256);
                int b = random.nextInt(256);
                // 分別表示:透明度(0~255)、紅、綠、藍
                paint.setARGB(255, r, g, b);
                /**
                 * 判斷Activity是否已經退出,如果退出則isdestroy為true,那么立刻讓線程對象與畫筆對象為空,并且break,
                 * 否則會造成內存溢出,此辦法必須在此處使用,否則會造成空指針的BUG。
                 */
                if (isdestroy) {
                    if (t != null) {
                        t = null;
                    }
                    if (paint != null) {
                        paint = null;
                    }
                    break;
                }
                // 睡眠
                SystemClock.sleep(50);
                // 可以讓ondraw方法重新執行
                postInvalidate();
                // invalidate();分線程無效,要在主線程使用
            }
        }
    }

    /**
     * 當窗口銷毀的時候會調用此方法,用于關閉資源
     */
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        isdestroy = true;
        System.out.println("onDetachedFromWindow");

    }

}

運行效果:運行起來是動態的,我不會上傳動態效果,想看效果的自己跑起來就可以了。

自定義View繪制圖像與移動字體

注意:這里的×××燈效果只是一種非常笨的方式,有更簡單的辦法,我以后會介紹!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

三明市| 南通市| 枣强县| 北宁市| 余姚市| 桐城市| 大洼县| 威宁| 禄劝| 贺州市| 通许县| 阳曲县| 玛曲县| 潢川县| 晋中市| 中山市| 安新县| 内乡县| 高雄市| 江陵县| 油尖旺区| 铅山县| 册亨县| 鸡西市| 江川县| 读书| 九台市| 荣成市| 信宜市| 邯郸市| 绍兴市| 广东省| 云浮市| 潢川县| 兰溪市| 保康县| 鄢陵县| 合川市| 阳西县| 资源县| 治县。|