android阿拉伯語
『壹』 如何在 Android 上的 TextView 上顯示阿拉伯語文本
import android.content.Context;
import android.graphics.Typeface;
public final class Farsi {
public static boolean isFarsiConversionNeeded = true;
private final static String szLamAndAlef = Character
.toString((char) 0xfedf)
+ Character.toString((char) 0xfe8e); // Lam + Alef
private final static String szLamStickAndAlef = Character
.toString((char) 0xfee0)
+ Character.toString((char) 0xfe8e); // Lam (Sticky !!!)+
// Alef
private final static String szLa = Character.toString((char) 0xfefb); // La
private final static String szLaStick = Character.toString((char) 0xfefc); // La
// (Sticky!!!)
private final static String szLamAndAlefWoosim = Character
.toString((char) 0xe1)
+ Character.toString((char) 0xbb); // Lam + Alef
private final static String szLamStickAndAlefWoosim = Character
.toString((char) 0x90)
+ Character.toString((char) 0xbb); // Lam (Sticky !!!)+
// Alef
private final static String szLaWoosim = Character.toString((char) 0xd9); // La
private final static String szLaStickWoosim = Character
.toString((char) 0xd9); // La
// (Sticky!!!)
private static final class struc {
public char character;
public char endGlyph;
public char iniGlyph;
public char midGlyph;
public char isoGlyph;
public struc(char Character, char EndGlyph, char IniGlyph,
char MidGlyph, char IsoGlyph) {
character = Character;
endGlyph = EndGlyph;
iniGlyph = IniGlyph;
midGlyph = MidGlyph;
isoGlyph = IsoGlyph;
}
}
static struc[] arrStruc = {
new struc((char) 0x630, (char) 0xfeac, (char) 0xfeab,
(char) 0xfeac, (char) 0xfeab),
new struc((char) 0x62f, (char) 0xfeaa, (char) 0xfea9,
(char) 0xfeaa, (char) 0xfea9),
new struc((char) 0x62c, (char) 0xfe9e, (char) 0xfe9f,
(char) 0xfea0, (char) 0xfe9d),
new struc((char) 0x62d, (char) 0xfea2, (char) 0xfea3,
(char) 0xfea4, (char) 0xfea1),
new struc((char) 0x62e, (char) 0xfea6, (char) 0xfea7,
(char) 0xfea8, (char) 0xfea5),
new struc((char) 0x647, (char) 0xfeea, (char) 0xfeeb,
(char) 0xfeec, (char) 0xfee9),
new struc((char) 0x639, (char) 0xfeca, (char) 0xfecb,
(char) 0xfecc, (char) 0xfec9),
new struc((char) 0x63a, (char) 0xfece, (char) 0xfecf,
(char) 0xfed0, (char) 0xfecd),
new struc((char) 0x641, (char) 0xfed2, (char) 0xfed3,
(char) 0xfed4, (char) 0xfed1),
new struc((char) 0x642, (char) 0xfed6, (char) 0xfed7,
(char) 0xfed8, (char) 0xfed5),
new struc((char) 0x62b, (char) 0xfe9a, (char) 0xfe9b,
(char) 0xfe9c, (char) 0xfe99),
new struc((char) 0x635, (char) 0xfeba, (char) 0xfebb,
(char) 0xfebc, (char) 0xfeb9),
new struc((char) 0x636, (char) 0xfebe, (char) 0xfebf,
(char) 0xfec0, (char) 0xfebd),
new struc((char) 0x637, (char) 0xfeTypeface tf = Farsi.GetFarsiFont(this);
MyTextView.setTypeface(tf);
MyTextView.setText(Farsi.Convert("سلام"));
, (char) 0xfeMyTextView.setText(Farsi.Convert("سلام"));
,
(char) 0xfec4, (char) 0xfec1),
new struc((char) 0x643, (char) 0xfeda, (char) 0xfedb,
(char) 0xfedc, (char) 0xfed9),
new struc((char) 0x645, (char) 0xfee2, (char) 0xfee3,
(char) 0xfee4, (char) 0xfee1),
new struc((char) 0x646, (char) 0xfee6, (char) 0xfee7,
(char) 0xfee8, (char) 0xfee5),
new struc((char) 0x62a, (char) 0xfe96, (char) 0xfe97,
(char) 0xfe98, (char) 0xfe95),
new struc((char) 0x627, (char) 0xfe8e, (char) 0xfe8d,
(char) 0xfe8e, (char) 0xfe8d),
new struc((char) 0x644, (char) 0xfede, (char) 0xfedf,
(char) 0xfee0, (char) 0xfedd),
new struc((char) 0x628, (char) 0xfe90, (char) 0xfe91,
(char) 0xfe92, (char) 0xfe8f),
new struc((char) 0x64a, (char) 0xfef2, (char) 0xfef3,
(char) 0xfef4, (char) 0xfef1),
new struc((char) 0x633, (char) 0xfeb2, (char) 0xfeb3,
(char) 0xfeb4, (char) 0xfeb1),
new struc((char) 0x634, (char) 0xfeb6, (char) 0xfeb7,
(char) 0xfeb8, (char) 0xfeb5),
new struc((char) 0x638, (char) 0xfec6, (char) 0xfec7,
(char) 0xfec8, (char) 0xfec5),
new struc((char) 0x632, (char) 0xfeb0, (char) 0xfeaf,
(char) 0xfeb0, (char) 0xfeaf),
new struc((char) 0x648, (char) 0xfeee, (char) 0xfeed,
(char) 0xfeee, (char) 0xfeed),
new struc((char) 0x629, (char) 0xfe94, (char) 0xfe93,
(char) 0xfe93, (char) 0xfe93),
new struc((char) 0x649, (char) 0xfef0, (char) 0xfeef,
(char) 0xfef0, (char) 0xfeef),
new struc((char) 0x631, (char) 0xfeae, (char) 0xfead,
(char) 0xfeae, (char) 0xfead),
new struc((char) 0x624, (char) 0xfe86, (char) 0xfe85,
(char) 0xfe86, (char) 0xfe85),
new struc((char) 0x621, (char) 0xfe80, (char) 0xfe80,
(char) 0xfe80, (char) 0xfe80),
new struc((char) 0x626, (char) 0xfe8a, (char) 0xfe8b,
(char) 0xfe8c, (char) 0xfe89),
new struc((char) 0x623, (char) 0xfe84, (char) 0xfe83,
(char) 0xfe84, (char) 0xfe83),
new struc((char) 0x622, (char) 0xfe82, (char) 0xfe81,
(char) 0xfe82, (char) 0xfe81),
new struc((char) 0x625, (char) 0xfe88, (char) 0xfe87,
(char) 0xfe88, (char) 0xfe87),
new struc((char) 0x67e, (char) 0xfb57, (char) 0xfb58,
(char) 0xfb59, (char) 0xfb56), // peh
new struc((char) 0x686, (char) 0xfb7b, (char) 0xfb7c,
(char) 0xfb7d, (char) 0xfb7a), // cheh
new struc((char) 0x698, (char) 0xfb8b, (char) 0xfb8a,
(char) 0xfb8b, (char) 0xfb8a), // jeh
new struc((char) 0x6a9, (char) 0xfb8f, (char) 0xfb90,
(char) 0xfb91, (char) 0xfb8e), // keheh
new struc((char) 0x6af, (char) 0xfb93, (char) 0xfb94,
(char) 0xfb95, (char) 0xfb92), // gaf
// new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfbfe,
// (char) 0xfbff, (char) 0xfbfc), // Farsi yeh
new struc((char) 0x6cc, (char) 0xfbfd, (char) 0xfef3,
(char) 0xfef4, (char) 0xfbfc), // Arabic yeh
new struc((char) 0x6c0, (char) 0xfba5, (char) 0xfba4,
(char) 0xfba5, (char) 0xfba4) // heh with yeh
};
『貳』 Android中selector使用詳解
選擇器在android中使用的非常廣泛,點擊反饋、選中、使能、聚焦等狀態切換都會用到選擇器。
一:下面是一個簡單的選擇器:
android:enterFadeDuration="200" 、android:exitFadeDuration="200":進入新狀態或退出舊狀態時會有一個200毫秒的漸變動畫。這兩個屬性使用的比較常見,可以使選擇器的狀態切換更加平滑。
以下幾個都是Drawable的屬性。
android:autoMirrored="true"對應drawable.setAutoMirrored(),這個屬性表示是否將drawable鏡像顯示,只有在從右往左布局的環境下才會生效。將此屬性設置成true,並將語言調節成阿拉伯語便可以看到效果。
android:dither="true"對應drawable.setDither(),這個屬性表示是否對圖像進行抖動處理。當圖像的bit-color較少時,通過顏色值的抖動來增加可用顏色數量,並保持較好的顯示效果。
android:visible="true" 對應drawable.setVisible(),設置Drawable是否可見,一般不會影響Drawable的行為,但是它是Drawable是否運行了動畫的一個暗示。例如:AnimationDrawable可以通過這個方法啟動或者停止動畫。
剩下兩個屬性對應DrawableContainer$DrawableContainerState裡面的屬性(DrawableContainer是Drawable的一個子類,DrawableContainerState是DrawableContainer的內部類)。
android:constantSize="true":當選擇器各個狀態的圖片大小不一時,設置為 true表示以最大的圖片的尺寸顯示,設置為false以默認的圖片的尺寸顯示(控制項大小會對現象有影響,需要是包裹內容的)。
android:variablePadding="false" :默認為false,這個屬性意義不大,通常不去設置。
二:Item的各種狀態,理解起來相對簡單,都可以從屬性的名字去理解其含義,例如:
狀態為加速的時候會顯示ic_launcher_m圖片,那麼是什麼加速呢?這就需要自己去分析一下,其實這里指的加速是對View的軟體加速或硬體加速。
當給View設置background、foreground或ImageView設置src時只能寫android:drawable="id":
當給文字顏色添加選擇器的時候必須要寫android:color="ARGB|RGB顏色值"
三:注意安卓程序在讀取選擇器文件時,是從上往下一個一個節點進行遍歷的,程序會選擇符合當前控制項狀態的第一個Item的內容。如果一個Item不寫任何狀態,表示它任何狀態都符合, 所以一般最後一個Item是不會寫任何狀態的(就像if(){}else if(){}else{}語句一樣,最後一個包含了剩下的所有情況)。
四:選擇器的Item和animated-rotate一起使用。
五:動態創建選擇器
動態創建一個簡單的選擇器:
用一張圖片,通過對圖片的著色創建選擇器:
創建矢量圖選擇器:
TextView文字顏色選擇器:
部分常用狀態數組:
『叄』 Android資源標簽屬性及優先順序(一)
在寫前一篇文章 淺述Android Apk打包流程 的時候發現解壓後的apk里res的資源文件,有多於我本地項目中的res資源文件夾。
如果我的項目中依賴了Android的一些庫,比如design庫,design裡面有自己的res,那麼在打包我的項目的時候,這些res會合並一起打包。
我查看了下,我確實依賴了design等庫。
對比一下前三張圖,我本地項目沒有建anim、anim-v21、animator-v21(不再截圖了)等資源文件夾,但是design庫有,最終一並打包到我的項目中。
res目錄下的文件夾是有命名規則的,不能隨便起,為的是要適配不同的設備,而且是要做到最佳的資源匹配。
2.1、資源標簽屬性及優先順序
除了解析度外,同種資源之間可以有下面許多資源屬性標簽,它們在匹配過程中是有優先順序順序的。大家可以快速瀏覽一下即可。以下資源標簽修飾語按照優先順序從高到低的順序排列。
3、Locale(語言和區域)
例如en表示英語,fr表示法語,en-rUS表示英語和美國地區。不區分大小寫,r用於區分區域碼。
4、Layout Direction(布局方向)
ldrtl,布局方向從右到左(阿拉伯語等會這樣布局);ldltr,布局方向從左到右,是默認的隱式值。(這就解答了我前面第二個提的問題了)
5、Smallest Screen Width(最小寬度)
sw<N>dp,屏幕的基本尺寸。
sw320dp:適用於320 320 ldpi、320 480 mdpi、480 480 hdpi
sw600dp:適用於600 1024mdpi (7英寸的平板電腦)
sw720dp:適用於720*1280 mdpi (10英寸平板電腦)
當你的屏幕的絕對寬度大於600dp時,屏幕就會自動調用layout-sw600dp文件夾裡面的布局。這里的絕對寬度是指手機的實際寬度,即與手機是否橫屏沒關系,也就是手機較小的邊的長度。
6、Screen Width(屏幕寬度)
w<N>dp ,設備的可用寬度值隨著當前是橫屏還是豎屏會產生變化,即它表示的是當前真實的寬度值。即當手機豎屏時,為較小邊的長度;當手機橫屏時,為較長邊的長度。
7、Screen Height(屏幕高度)
h<N>dp,與lScreen Width的使用一樣,只是這里指的是相對的高度。指手機相對放置的高度;即當手機豎屏時,為較長邊的長度;當手機橫屏時,為較小邊的長度。
8、Size(屏幕大小)
samll:低密度,最小布局尺寸為320 426dp
normal:中等密度,標准屏幕最小布局尺寸約為320 470dp
large:中等密度,大屏幕最小布局尺寸為480 640dp
xlarge:大於中等密度,最小布局尺寸為720 960dp。基本用於平板電腦。
該配置並不僅適用於指定設備,如果沒有匹配的資源,會選擇與之最近的。 如果所有資源均大於當前屏幕的尺寸限定符,則系統不會使用這些資源,且應用運行時會崩潰。
9、Ratio(屏幕縱橫比)
long:寬屏
notlong:非寬屏
10、Orientation(屏幕方向)
port:豎向的
land:橫向的
square:正方形的(我也不知道這個是什麼樣子的)
11、UI Mode(UI模式)
無、car、desk、 television、appliance、 watch6種模式。(其實我沒看明白是幹嘛的,哈哈)
12、Night Mode(夜間模式)
night:夜間模式
notnight:非夜間模式
可以通過UiModeManager來開啟和關閉這一功能。
13、Density(屏幕像素密度)
ldpi:低密度,約120dpi;mdpi:中等密度,160dpi;hdpi:高密度,240dpi;xhdpi:超高密度,320dpi;xxhdpi:超超高密度,480dpi;xxxhdpi:超超超高密度,640dpi;nodpi:不希望以匹配設備密度的點陣圖資源;tvdpi:主要用於電視,約213dpi。anydpi:適用於所有密度,優先順序高於其他限定符。
14、Touch Screen(觸摸屏)
notouch:設備不帶觸摸屏
stylus:觸摸屏通過手寫筆操作
finger:觸摸屏通過手指操作
15、Keyboard(鍵盤可用性)
keysexposed:設備有可用鍵盤。如果當前的軟鍵盤被啟用,那麼即便設備沒有鍵盤或者鍵盤不可用,這個狀態仍可能有效。
keyshidden:設備有鍵盤,但當前被隱藏,而且沒有軟鍵盤啟用。
keyssoft:設備當前軟鍵盤啟動,即便它處於可見或不可見狀態。
16、Text Input(文本輸入法)
nokeys:設備不帶用用於文本輸入的按鍵
qwerty:設備具有標准硬鍵盤(無論是否對用戶可見)
12key:設備具有 12 鍵硬鍵盤(無論是否對用戶可見)
17、Navigation State(定位鍵可用性)
描述定位鍵是否可用,指的是游標定位,非GPS導航的定位。
navexposed:定位鍵對用戶可用
navhidden:定位鍵對用戶不可用
18、Navigation Method(主要的非觸摸屏定位方式)
nonav:設備除了觸摸屏外沒有其他定位方式
dpad:設備具有用於導航的方向鍵
trackball:設備具有用於導航的軌跡球
wheel:設備有方向滾輪用於定位,不常用
19、Dimension(尺寸)
20、Version(平台版本)
設備支持的 API 級別。例如v4 對應於 API 級別 4,帶有 Android 1.6 或更高版本系統的設備。
2.2、怎麼在AS中創建這些文件夾呢?
『肆』 android自定義軟鍵盤支持多語言
支持。android自定義軟鍵盤支持阿拉伯語、英語、德語、義大利語、漢語、葡萄牙語和西班牙語等,還支持用各種新語言搜索表情符號的能力。
『伍』 android應用內怎麼設置語言切換
1.在工程res文件下添加對應語種的values文件,ar:阿拉伯語, en:英語 zh_rCN: 簡體中文
截圖如下:
2 .在功能清單文件中對要進行切換acitivity 進行配置添加
android:configChanges="locale"
3.對語言選擇的處理
public class MainActivity extends Activity {
Context context = MainActivity.this;;
int languageId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
read();//設置
setContentView(R.layout.main);
findViewById(R.id.btn_change).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
save();
}
});
}
//保存
private void save() {
String[] languages = { "默認", "CN", "EN" };
AlertDialog.Builder builder = new AlertDialog.Builder(context,
android.R.style.Animation_Dialog);
builder.setTitle("選擇語言");
final SharedPreferences languagePre = context.getSharedPreferences(
"language_choice", context.MODE_PRIVATE);
final int id = languagePre.getInt("id", 0);
builder.setSingleChoiceItems(languages, id,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int index) {
switch (index) {
case 0:
// 系統默認語言
languageId = 0;
break;
case 1:
// 簡體中文
languageId = 1;
break;
case 2:
// 英語
languageId = 2;
break;
case 3:
// 阿拉伯語
languageId = 3;
break;
default:
break;
}
languagePre.edit().putInt("id", languageId).commit();
}
});
// 保存
builder.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((Activity) context).finish();
Intent intent = new Intent();
intent.setClass(context, MainActivity.class);
context.startActivity(intent);
}
});
builder.show();
}
//讀取
private void read() {
SharedPreferences languagePre = getSharedPreferences("language_choice",
Context.MODE_PRIVATE);
int id = languagePre.getInt("id", 0);
Log.d("MainActivity", "langauge_id=" + id);
Toast.makeText(context, "langauge_id=" + id, Toast.LENGTH_LONG).show();
// 應用內配置語言
Resources resources = getResources();// 獲得res資源對象
Configuration config = resources.getConfiguration();// 獲得設置對象
DisplayMetrics dm = resources.getDisplayMetrics();// 獲得屏幕參數:主要是解析度,像素等。
switch (id) {
case 0:
config.locale = Locale.getDefault(); // 系統默認語言
break;
case 1:
config.locale = Locale.SIMPLIFIED_CHINESE; // 簡體中文
break;
case 2:
config.locale = Locale.ENGLISH; // 英文
break;
default:
config.locale = Locale.getDefault();
break;
}
resources.updateConfiguration(config, dm);
}
}