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,自然就擁有通