1. 程式人生 > >android的特殊文字與Titanic的特效

android的特殊文字與Titanic的特效

android中給Textview換個字型樣式有時候還是能使人心情愉悅的,當然不要把這個操作想的太複雜,其實很簡單。
然後就是Titanic,他需要一張圖片進行渲染,下方貼出。好了,效果圖在此。
這裡寫圖片描述

無法錄製gif……
廢話不多說上程式碼
首先先說android改變字型格式它有兩種方法
兩種方法的共同點是都需要在main下建立一個assets
這裡寫圖片描述

看見assets裡面的那些字型格式了吧,網上到處都有.ttf型別的字型格式,挑選自己中意的然後放入assets下,保險起見最好在assets下建立一個font。
做完這一步就該說兩種方法了。
第一種xml裡面的方法
這個方法需要先寫一個自定義的Textview

public class MyFontTextView extends TextView {

    public MyFontTextView(Context context) {
        super(context);
        init(context);
        // TODO Auto-generated constructor stub
    }

    public MyFontTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
        // TODO Auto-generated constructor stub
} public MyFontTextView(Context context, AttributeSet attrs) { super(context, attrs); init(context); // TODO Auto-generated constructor stub } private void init(Context context) { // TODO Auto-generated method stub AssetManager aManager=context.getAssets(); Typeface font=Typeface.createFromAsset(aManager, "font/english.ttf"
); setTypeface(font); } }

方法可以直接粘來用
然後就是xml裡調一下就可

     <bwei.com.caonima.MyFontTextView
                android:gravity="center"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="7dp"
                android:textStyle="bold"
                android:id="@+id/psps"
                android:text="Jingdong mall"
                android:textColor="#000000"
                android:textSize="30sp" />

第二種就簡單了
佈局直接Textview皆可
然後就是主方法裡寫一點程式碼即可
Typeface face = Typeface.createFromAsset(getAssets(),”font/english.ttf”);
psp.setTypeface(face);
可簡單。

這個是單獨的寫字型
然後是單獨的Titanic
寫幾個自定義的Titanic

public class Titanic {

    private AnimatorSet animatorSet;
    private Animator.AnimatorListener animatorListener;

    public Animator.AnimatorListener getAnimatorListener() {
        return animatorListener;
    }

    public void setAnimatorListener(Animator.AnimatorListener animatorListener) {
        this.animatorListener = animatorListener;
    }

    public void start(final TitanicTextView textView) {

        final Runnable animate = new Runnable() {
            @Override
            public void run() {

                textView.setSinking(true);

                // horizontal animation. 200 = wave.png width
                ObjectAnimator maskXAnimator = ObjectAnimator.ofFloat(textView, "maskX", 0, 200);
                maskXAnimator.setRepeatCount(ValueAnimator.INFINITE);
                maskXAnimator.setDuration(1000);
                maskXAnimator.setStartDelay(0);

                int h = textView.getHeight();

                // vertical animation
                // maskY = 0 -> wave vertically centered
                // repeat mode REVERSE to go back and forth
                ObjectAnimator maskYAnimator = ObjectAnimator.ofFloat(textView, "maskY", h/2, - h/2);
                maskYAnimator.setRepeatCount(ValueAnimator.INFINITE);
                maskYAnimator.setRepeatMode(ValueAnimator.REVERSE);
                maskYAnimator.setDuration(10000);
                maskYAnimator.setStartDelay(0);

                // now play both animations together
                animatorSet = new AnimatorSet();
                animatorSet.playTogether(maskXAnimator, maskYAnimator);
                animatorSet.setInterpolator(new LinearInterpolator());
                animatorSet.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        textView.setSinking(false);

                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                            textView.postInvalidate();
                        } else {
                            textView.postInvalidateOnAnimation();
                        }

                        animatorSet = null;
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });


                if (animatorListener != null) {
                    animatorSet.addListener(animatorListener);
                }

                animatorSet.start();
            }
        };

        if (!textView.isSetUp()) {
            textView.setAnimationSetupCallback(new TitanicTextView.AnimationSetupCallback() {
                @Override
                public void onSetupAnimation(final TitanicTextView target) {
                    animate.run();
                }
            });
        } else {
            animate.run();
        }
    }

    public void cancel() {
        if (animatorSet != null) {
            animatorSet.cancel();
        }
    }
}
public class TitanicTextView extends TextView {

    public interface AnimationSetupCallback {
        public void onSetupAnimation(TitanicTextView titanicTextView);
    }

    // callback fired at first onSizeChanged
    private AnimationSetupCallback animationSetupCallback;
    // wave shader coordinates
    private float maskX, maskY;
    // if true, the shader will display the wave
    private boolean sinking;
    // true after the first onSizeChanged
    private boolean setUp;

    // shader containing a repeated wave
    private BitmapShader shader;
    // shader matrix
    private Matrix shaderMatrix;
    // wave drawable
    private Drawable wave;
    // (getHeight() - waveHeight) / 2
    private float offsetY;

    public TitanicTextView(Context context) {
        super(context);
        init();
    }

    public TitanicTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TitanicTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        shaderMatrix = new Matrix();
    }

    public AnimationSetupCallback getAnimationSetupCallback() {
        return animationSetupCallback;
    }

    public void setAnimationSetupCallback(AnimationSetupCallback animationSetupCallback) {
        this.animationSetupCallback = animationSetupCallback;
    }

    public float getMaskX() {
        return maskX;
    }

    public void setMaskX(float maskX) {
        this.maskX = maskX;
        invalidate();
    }

    public float getMaskY() {
        return maskY;
    }

    public void setMaskY(float maskY) {
        this.maskY = maskY;
        invalidate();
    }

    public boolean isSinking() {
        return sinking;
    }

    public void setSinking(boolean sinking) {
        this.sinking = sinking;
    }

    public boolean isSetUp() {
        return setUp;
    }

    @Override
    public void setTextColor(int color) {
        super.setTextColor(color);
        createShader();
    }

    @Override
    public void setTextColor(ColorStateList colors) {
        super.setTextColor(colors);
        createShader();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        createShader();

        if (!setUp) {
            setUp = true;
            if (animationSetupCallback != null) {
                animationSetupCallback.onSetupAnimation(TitanicTextView.this);
            }
        }
    }

    /**
     * Create the shader
     * draw the wave with current color for a background
     * repeat the bitmap horizontally, and clamp colors vertically
     */
    private void createShader() {

        if (wave == null) {
            wave = getResources().getDrawable(R.drawable.wave);
        }

        int waveW = wave.getIntrinsicWidth();
        int waveH = wave.getIntrinsicHeight();

        Bitmap b = Bitmap.createBitmap(waveW, waveH, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);

        c.drawColor(getCurrentTextColor());

        wave.setBounds(0, 0, waveW, waveH);
        wave.draw(c);

        shader = new BitmapShader(b, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);
        getPaint().setShader(shader);

        offsetY = (getHeight() - waveH) / 2;
    }

    @Override
    protected void onDraw(Canvas canvas) {

        // modify text paint shader according to sinking state
        if (sinking && shader != null) {

            // first call after sinking, assign it to our paint
            if (getPaint().getShader() == null) {
                getPaint().setShader(shader);
            }

            // translate shader accordingly to maskX maskY positions
            // maskY is affected by the offset to vertically center the wave
            shaderMatrix.setTranslate(maskX, maskY + offsetY);

            // assign matrix to invalidate the shader
            shader.setLocalMatrix(shaderMatrix);
        } else {
            getPaint().setShader(null);
        }

        super.onDraw(canvas);
    }
}

這兩個類一寫就是佈局了

 <bwei.com.caonima.xiaodongxi.TitanicTextView
                android:gravity="center"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="7dp"
                android:textStyle="bold"
                android:id="@+id/psps"
                android:text="Jingdong mall"
                android:textColor="#000000"
                android:textSize="30sp" />

然後就是主頁面
new Titanic().start(psp);
完事
這都是單獨的

現在需要給它們兩個合起來
其實一樣的把上面兩個Titanic類一粘就是佈局上面的佈局

 <bwei.com.caonima.xiaodongxi.TitanicTextView
                android:gravity="center"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:padding="7dp"
                android:textStyle="bold"
                android:id="@+id/psps"
                android:text="Jingdong mall"
                android:textColor="#000000"
                android:textSize="30sp" />

然後就是主頁面

        Typeface face = Typeface.createFromAsset(getAssets(),"font/english.ttf");
        psp.setTypeface(face);
        new Titanic().start(psp);

完事了,寫了半天看起好麻煩了樣子其實很簡單!怪我太囉嗦!

相關推薦

android特殊文字Titanic特效

android中給Textview換個字型樣式有時候還是能使人心情愉悅的,當然不要把這個操作想的太複雜,其實很簡單。 然後就是Titanic,他需要一張圖片進行渲染,下方貼出。好了,效果圖在此。 無法錄製gif…… 廢話不多說上程式碼 首先先說a

android RadioButton 文字圖示的位置

<RadioButton android:id="@+id/button1" android:layout_width="fill_parent" android:layout_hei

Android 中的一些特殊目錄文件

mtd 安裝文件 df -h card 端口號 car 路徑 文件中 name 用作命令的二進制文件位於/system/bin/與/system/xbin/下 應用數據位於/data/data/, 原始安裝文件位於/data/app/(Play商店中非免費應用位於/data

android,textView文字drawableLeft圖片無法對齊

textView文字相對於控制元件有內邊距,導致看起來和本來設定對齊的圖片不是對齊的,這時可用android:includeFontPadding="false"屬性去掉textview內邊距,使他們對齊。 去掉textview或者button的空白: android:p

Android實戰技巧之一:文字佈局(字串變數在資源裡替換)

//別看這個標題挺大,其實這次要說的只是3個小技巧。 //2014.11.7 update 1、字串資源裡變數替換 工作中是拒絕硬編碼的,Android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.

android clickspan點選富文字本身點選事件衝突問題

http://stackoverflow.com/questions/16792963/android-clickablespan-intercepts-the-click-event 這裡邊有詳細的解決方法與解釋

Android動畫機制使用技巧(三)Android動畫特效

下面來例舉一些動畫效果例項,讓大家熟悉如何通過Android的動畫框架來建立賞心悅目的動畫 靈動選單 下圖中展示的是靈動選單的效果圖。當用戶點選小紅點後,彈出選單,並帶有一個緩衝的過渡動畫,這也是Google在Material Design中所強調的動畫

Android繪圖機制處理技巧(五)Android影象處理之畫筆特效處理

前面的文章中已經學習了常用的畫筆屬性,比如普通的畫筆(Paint),帶邊框、填充的style,顏色(Color),寬度(StrokeWidth),抗鋸齒(ANTI_ALIAS_FLAG)等,然而Android還提供了各種各樣專業的畫筆工具,如記號筆、毛筆、蠟筆等

Android實戰技巧之一 文字佈局

                //別看這個標題挺大,其實這次要說的只是3個小技巧。//2014.11.7 update1、字串資源裡變數替換工作中是拒絕硬編碼的,android裡會把一些字串等放在xml中當做資源使用,如專案中values下的strings.xml列出了app_name.有些情況是這樣的,程

android 特殊符號開頭的聯系人歸並至“#”下

cts ras class package src 版本 vid 版本號 fas 在PeopleActivity界面。聯系人的顯示位置是由其display name的第一個字符決定的。 數字開頭的聯系人會顯示在“#”這個header下。 中英文聯系人會顯示在“A” 到“

Android文字體的設置方法和使用技巧

paint mono tail water 無效 ebo roi eat cep Android TextView字體顏色等樣式具體解釋連接:http://blog.csdn.net/pcaxb/article/details/47341249 1.使用字體庫(自己定

Android 進程線程管理

程序 and 定義 target receiver png 情況 android開發 基本上 一、簡介   進程(Process)是程序的一個運行的實例,以區別“程序”這一靜態的概念。線程(Thread)是CPU調用的基本單位。 二、進程的組成部分   在Android中的

學習小記:JS判斷時特殊boolean類型的轉換

ring something mbo true mage js框架 temp some .info 扒開JQuery以及其他一些JS框架源碼,常常能看到下面這樣的判斷, 寫慣了C#高級語言語法的我,一直以來沒能系統的理解透這段代碼。 var test; //do

Day15 - linux的特殊符號正則表達式

find 括號 window type yellow 啟動 字符 clip 標準輸出 第1章 linux的特殊符號 1.1 通配符 * {} 1.1.1 含義 方便查找文件 通配符是用來找文件名字的。 1.1.2 * 通過find 命令找以 .sh 結尾的文件

Android API level version對應關系

rsh padding border jelly ice android ble 4.2 hone Platform Version API Level VERSION_CODE 中文名稱 Android API 26 26 Android 7.1.1

Android studio安裝配置

zip 第一次 spa 隨機 模擬器 next 導出 配置 tool Android studio安裝與配置 1、首先下載Android studio安裝包,可以從http://www.android-studio.org/下載最新版本,這裏采用3.0版本進

65.shell特殊符號和cut,sort,wc,uniq,tee,tr,split命令

character 刪除重復的字符 處理 將他 語法 去重 截取 通用 統計字符數 liunx的特殊符號 代表字母或者數字 多個 ? 任意一個字符"#" 註釋\ 脫義字符| 管道符 1.* 代表任意個任意字符或者數字 [root@l

4.1.7 特殊方法運算符重載

clas 這一 1.7 生成 tle tro .py 地址 定義類   Python的類有大量的特殊方法,其中比較常見的是構造函數和析構函數。Python中類的構造函數是__init__(),一般用來為數據成員設置初始值或進行其他必要的初始化工作,在創建對象時被自動調用和執

APP中關於Android和IOS網頁交互

frame win android rem androi create out eth sta 安卓交互: //安卓js代碼start function bntcat(){ if(isAndroid){ musicP

Android客戶端本地服務器Socket通信

msg 初始化 ips print rmi listener 個數 myeclips 開啟 Android客戶端與本地服務器Socket通信 Socket服務器運行結果圖?? 一.客戶端和服務器端的選擇: 客戶端是我們手機端,關於服務器端,只要安裝了JDK,自然就擁有通