Android自定義View(跑馬燈、viewpager左右滑動、列表側滑、優酷菜單、水波紋)

自定義View

在安卓開發中,自定義控件的需求很多很多,而掌握自定義控件稱得上是開發人員的入門技術啦。而自定義控件也稱得上是十分強大的一個操作。它可以實現傳統控件和系統控件所不能實現的效果。比如最基本的圓形圖片和跑馬燈效果,對於自定義控件來說就是分分鐘的事。今天我做了一個小demo,實現了這跑馬燈效果,圓形圖片的一百度一大把,就不寫那個了。

GitHub地址:https://github.com/cctxwan/ZDYKJ
CSDN地址:https://download.csdn.net/download/qq_35840038/11057580

各種效果圖如下:

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

在這我就不多廢話啦,直接上代碼(只上傳滾動textview的代碼,其他功能可以下載源碼進行查看)

package com.cc.youku.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

/**
 * 滾動的TextView
 * 這裏是寫死的文字,如果想要動態傳入的話,從構造器傳入可以實現
 */
public class ScrollTextView extends View {

    //畫筆
    private Paint paint = new Paint();
    //默認從0開始滾動
    private float i = 0;
    //自定義線程,讓其通過對i值的修改達到滾動的效果
    private MyThread thread;

    /**
     * 界面直接調用用這個構造器
     * @param context
     */
    public ScrollTextView(Context context) {
        super(context);
    }

    /**
     * XML裏面用這個構造器
     * @param context
     * @param attrs
     */
    public ScrollTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        //設置滾動字體大小
        paint.setTextSize(50);
        //實現一個textview
        canvas.drawText("我是滾動的TextView", i, 50, paint);
        //實例化自定義線程並啓動
        if(thread == null){
            thread = new MyThread();
            thread.start();
        }
    }

    /**
     * 自定義線程
     */
    class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            //死循環
            while (true){
                //對i值每次修改
                i += 3;
                //當i大於getWidth()(屏幕寬度)時,說明已經看不到了
                if(i > getWidth()){
                    //設置i的大小讓其通過paint的mea方法是計算文字長度,達到效果
                    i = 0 - paint.measureText("我是滾動的TextView");
                }

                //view提供的刷新繪製方法的方法
                postInvalidate();
                try {
                    //隔30ms執行
                    this.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

注:這裏是寫死的文字,如果想要動態傳入的話,從構造器傳入可以實現

附上demo源碼

GitHub地址:https://github.com/cctxwan/ZDYKJ

q:486789970
email:[email protected]

如果有什麼問題,歡迎大家指導。並相互聯繫,希望能夠通過文章互相學習。

																								---財財親筆
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章