網上的各位大神為了實現兩邊對其,大家也算是腦洞大開,大致上為使用空格填充,或者將所有字元統一大小來實現兩邊對其。這種做法雖然很簡單,但是只能應付一些單純的場景。一旦場景複雜起來就會顯露弊端。例如文字間距忽大忽小,句末文字沒有貼邊等一些問題。俗話說得好,撿最貴的飲料瓶,裝最精緻的逼。這麼粗糙的方法當然不能忍受。那麼有沒有方法來解決以上問題呢?當然是有的:
兩邊對其原理
其實原理很簡單,首先先得到我們要顯示文字的文字框的寬度。隨後計算出一行最多能夠容納多少個文字,然後讀取文字,將文字繪製在textview上,在繪製之前計算出當前行的長度減去本行最大容納文字的總長度,最後將這些長度均攤到這一行所有的文字間隔中,這樣就可以達到,收尾貼邊,並且整行文字間隔相等的狀態。詳細的內容都寫在**注釋裡,直接看**即可。
**
package com.flyme.systemuitools.gameassiant.gamemode.view;
import android.content.context;
import android.graphics.canvas;
import android.text.layout;
import android.text.staticlayout;
import android.text.textpaint;
import android.util.attributeset;
import android.widget.textview;
public class droidaligntextview extends textview
public droidaligntextview(context context, attributeset attrs)
public droidaligntextview(context context, attributeset attrs, int defstyleattr)
private void init()
@override
protected void ondraw(canvas canvas)
if (i == linecount - 1) else
} else
if (linetext.charat(linetext.length() - 1) == '\n')
canvas.drawtext(linetext, 0, mliney, paint);
if(linetext.equals("\n"))
}mliney += getlineheight();//寫完一行以後,高度增加一行的高度}}
/*** 重繪此行.
** @param canvas 畫布
* @param linetext 該行所有的文字
* @param linewidth 該行每個文字的寬度的總和
*/private void drawscaletext(canvas canvas, string linetext, float linewidth)
//比如說一共有5個字,中間有4個間隔,
//那就用整個textview的寬度 - 5個字的寬度,
//然後除以4,填補到這4個空隙中
float interval = (mviewwidth - linewidth) / (linetext.length() - 1);
for (int i = 0; i < linetext.length(); ) else
float cw = staticlayout.getdesiredwidth(character, paint);
canvas.drawtext(character, x, mliney, paint);
x += (cw + interval);}}
/*** 判斷是不是段落的第一行.
* 乙個漢字相當於乙個字元,此處判斷是否為第一行的依據是:
* 字元長度大於3且前兩個字元為空格
** @param linetext 該行所有的文字
*/private boolean isfirstlineofparagraph(string linetext)
/*** 判斷需不需要縮放.
** @param linetext 該行所有的文字
* @return true 該行最後乙個字元不是換行符 false 該行最後乙個字元是換行符
*/private boolean needscale(string linetext) else
}/**
* 判斷是否是emoji
** @param codepoint 比較的單個字元
* @return
*/private boolean isemojicharacter(char codepoint)
}
Android 自定義View實現文字描邊
1 textview疊加 這種方式靈活性較差 2 在textview的ondraw之前繪製一次相同的文字 3 完全自定義,呼叫兩次drawtext 第二種和第三種方式本質是一樣的,都是呼叫兩次drawtext方法。if mtextpaint null canvas.drawtext text,0,b...
android 自定義dialog 多選項對話方塊
最近做的launcher專案裡乙個顯示對話方塊效果。好多朋友都問我要 所以今天抽了點時間把這段 扣出來,分享給大家 的朋友,請標明出處,尊重作者的勞動成果 上圖吧 相對較多些,我就不一一闡述。專案裡摳出來的,一些沒必要的也都在裡邊了。使用作法如下 public class mainactivity ...
自定義annotation註解並對其做切面
編寫乙個註解 target elementtype.method retention retentionpolicy.runtime documented method requestmethod.get public inte ce requestget aliasfor class string...