今天记录一下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文字的倒影效果实现代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)