android的特殊文字与Titanic的特效

来源:互联网 发布:战争游戏红龙 知乎 编辑:程序博客网 时间:2024/06/07 06:51

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

完事了,写了半天看起好麻烦了样子其实很简单!怪我太啰嗦!

原创粉丝点击