android显示TextView文字的倒影效果实现代码

android显示TextView文字的倒影效果实现代码,第1张

概述今天记录一下TextView的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图:

今天记录一下TextVIEw的倒影效果,显示一串文字,然后在文字的下方显示出它的倒影,先上效果图:

最重要的就是VIEw中getDrawingCache()方法,该方法可以获取cache中的图像,然后绘制出来。

废话不多说,我是想写一个带有倒影的时间,时间可以走动。首先先写一个带有时间走动的VIEw,这个很简单,获取当前时间,然后开启一个线程,隔一秒获取当前时间一次,然后显示在TextVIEw上,当然,我们写控件,就需要继承TextVIEw,代码如下:

复制代码 代码如下:
package com.alex.reflecttextvIEw;

import java.util.Calendar;

import androID.content.Context;
import androID.os.Handler;
import androID.os.Message;
import androID.text.format.DateFormat;
import androID.util.AttributeSet;
import androID.Widget.TextVIEw;

public class TimeVIEw extends TextVIEw {

    private static final int MESSAGE_TIME = 1;

    public TimeVIEw(Context context,AttributeSet attrs) {
        super(context,attrs);
        new TimeThread().start();
    }

    public class TimeThread extends Thread {
        @OverrIDe
        public voID run() {
            do {
                try {
                    Message msg = new Message();
                    msg.what = MESSAGE_TIME;
                    mHandler.sendMessage(msg);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printstacktrace();
                }
            } while (true);
        }
    }

    private Handler mHandler = new Handler() {

        @OverrIDe
        public voID handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
            case MESSAGE_TIME:
                setTime();
                break;

            default:
                break;
            }
        }
    };

    public voID setTime() {
        long sysTime = System.currentTimeMillis();
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(sysTime);
        String sysTimeStr = DateFormat.format("hh:mm",sysTime).toString();
        if(calendar.get(Calendar.AM_PM) == 0) {
            sysTimeStr += " AM";
        } else {
            sysTimeStr += " PM";
        }
        setText(sysTimeStr.replace("1"," 1"));
    }
}

现在只需要在布局文件中调用该控件就可以实现一个走动的时间了。

第二步就是需要给这个走动的时间加上倒影了,我们就需要写一个控件来继承上面一个时间走动的控件,就可以实现带有倒影的时间走动的VIEw了,下面是带有倒影的代码:

复制代码 代码如下:
package com.alex.reflecttextvIEw;


import androID.content.Context;
import androID.graphics.Bitmap;
import androID.graphics.Canvas;
import androID.graphics.linearGradIEnt;
import androID.graphics.Matrix;
import androID.graphics.Paint;
import androID.graphics.PorterDuff.Mode;
import androID.graphics.PorterDuffXfermode;
import androID.graphics.Shader.TileMode;
import androID.util.AttributeSet;

public class ReflectTextVIEw extends TimeVIEw {

    private Matrix mMatrix;
    private Paint mPaint;

    public ReflectTextVIEw(Context context,attrs);
        init();
    }

    private voID init() {
        mMatrix = new Matrix();
        mMatrix.preScale(1,-1);
    }

    @OverrIDe
    protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {
        super.onMeasure(wIDthMeasureSpec,heightmeasureSpec);
        setMeasuredDimension(getMeasureDWIDth(),(int)(getMeasuredHeight()*1.67));
    }

    @OverrIDe
    protected voID onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int height = getHeight();
        int wIDth = getWIDth();
        setDrawingCacheEnabled(true);
        Bitmap originalimage = Bitmap.createBitmap(getDrawingCache());
        Bitmap reflectionImage = Bitmap.createBitmap(originalimage,height/5,wIDth,height/2,mMatrix,false);
        canvas.drawBitmap(reflectionImage,height/3f,null);
        if(mPaint == null)  {
            mPaint = new Paint();  
            linearGradIEnt shader = new linearGradIEnt(0,
                    height,0x7fffffff,0x0fffffff,TileMode.CLAMP);
            mPaint.setShader(shader);
            mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
        }
        canvas.drawRect(0,height/2f,height,mPaint);
    }

    @OverrIDe
    protected voID onTextChanged(CharSequence text,int start,
            int lengthBefore,int lengthAfter) {
        super.onTextChanged(text,start,lengthBefore,lengthAfter);
        buildDrawingCache();
        postInvalIDate();
    }
}

主要功能在onDraw方法里面,先调用setDrawingCacheEnabled(true);让cache可用,然后通过cache创建一个和原图片一样的图像,通过mMatrix.preScale(1,-1);使图片倒过来,调用Bitmap.createBitmap(originalimage,false);创建一个倒过来的图像,调用canvas.drawBitmap(reflectionImage,null);把倒过来的图像画到画布上。通过调用linearGradIEnt shader = new linearGradIEnt(0,
height,TileMode.CLAMP);
mPaint.setShader(shader);
mPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));使倒影的图像的颜色渐变,由灰色变为黑色。

时间走动时调用buildDrawingCache();
postInvalIDate();

让倒影从新绘制。

调用setMeasuredDimension(getMeasureDWIDth(),(int)(getMeasuredHeight()*1.67));设置图像的宽度和高度。

好了,控件已经写完了,现在只要在布局中调用这个控件就可以在Activity中显示一个带有倒影的时间的VIEw了,先写一个布局文件:

复制代码 代码如下:
<?xml version="1.0" enCoding="utf-8"?>
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"
    androID:layout_wIDth="match_parent"
    androID:layout_height="match_parent"
    androID:background="#000000"
    androID:paddingtop="@dimen/activity_vertical_margin" >

    <com.alex.reflecttextvIEw.ReflectTextVIEw
            androID:ID="@+ID/timeVIEw"
             androID:textSize="@dimen/reflect_size"
              androID:layout_wIDth="match_parent"
              androID:layout_height="wrap_content"
              androID:layout_alignParentBottom="true"
              androID:gravity="top|center_horizontal" />
</relativeLayout>

然后在Activity中显示这个布局,我把这个控件的字体从新设置了一下,让它显示的方方正正。

复制代码 代码如下:
package com.alex.reflecttextvIEw;

import androID.app.Activity;
import androID.graphics.Typeface;
import androID.os.Bundle;
import androID.vIEw.Window;
import androID.vIEw.WindowManager;

public class MainActivity extends Activity {

    @OverrIDe
    protected voID onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Window win = getwindow();
        win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_disMISS_KEyguard);
        win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        setContentVIEw(R.layout.activity_main);
        TimeVIEw tv = (TimeVIEw) findVIEwByID(R.ID.timeVIEw);
        tv.setTypeface(Typeface.createFromAsset(getAssets(),"Fonts/DS-DIGII.TTF"));
    }
}

运行代码,手机上就回显示一个带有倒影的时间VIEw,时间还会走动,是不是很好玩。

好了,就到这里吧。

源码下载地址:http://xiazai.jb51.net/201402/yuanma/ReflectTextView(jb51.net).rar

总结

以上是内存溢出为你收集整理的android显示TextView文字的倒影效果实现代码全部内容,希望文章能够帮你解决android显示TextView文字的倒影效果实现代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1142447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存