編輯:Android開發實例
Android IMF提供了實現第三方輸入法的快捷通道,這個框架基能夠滿足一般輸入法的開發需要,顯然設計者對於IMF還是投入了不少精力。但是任何的設計都不可能是盡善盡美, 設計者並非是萬能的神,所有的方面他都考慮到,總有一些地方做的不夠好,留下一些瑕疵。在我的工作當中,就發現了這麼一個不盡人意的地方。
此前受客戶委托,開發一個輸入法,其中有一個要求,即DELETE鍵和其他按鍵不一樣,背景要區別於其他普通按鍵。這意味著我們程序應該達到這樣一個效果,每個按鍵獨立享有背景設置。
通過IMF的分析可以知道,KeyboardView的XML屬性android:keyBackground,可以為按鍵定義背景。縱觀Android PinyinIME,即谷歌拼音輸入法,其每個按鍵的背景都是相同的,似乎它並沒有想到單獨為按鍵設置背景。
進而查看它的源碼,更加印證我的猜測,在KeyboardView類的onBufferDraw方法中可以看到背景的繪制方法:
for (int i = 0; i < keyCount; i++) { final Key key = keys[i]; if (drawSingleKey && invalidKey != key) { continue; } int[] drawableState = key.getCurrentDrawableState(); keyBackground.setState(drawableState); // Switch the character to uppercase if shift is pressed String label = key.label == null? null : adjustCase(key.label).toString(); final Rect bounds = keyBackground.getBounds(); if (key.width != bounds.right || key.height != bounds.bottom) { keyBackground.setBounds(0, 0, key.width, key.height); } canvas.translate(key.x + kbdPaddingLeft, key.y + kbdPaddingTop); keyBackground.draw(canvas); // 省去剩余部分 }
其中的keyBackground正是我們所要尋找的關鍵,可惜Android IMF的設計師在這個地方偷懶了,他沒有提供給我們單獨設置keyBackGround的接口。如果繼續看下去,我們會看到按鍵icon的實現,此時你會覺得我說設計師在偷懶一點都不為過,為什麼呢?我們來看按鍵icon部分是如何繪制的。
else if (key.icon != null) { final int drawableX = (key.width - padding.left - padding.right - key.icon.getIntrinsicWidth()) / 2 + padding.left; final int drawableY = (key.height - padding.top - padding.bottom - key.icon.getIntrinsicHeight()) / 2 + padding.top; canvas.translate(drawableX, drawableY); key.icon.setBounds(0, 0, key.icon.getIntrinsicWidth(), key.icon.getIntrinsicHeight()); key.icon.draw(canvas); canvas.translate(-drawableX, -drawableY); }
就這樣,按鍵的icon可以單獨設置,並且方便的繪制處理,那麼為什麼背景就要一刀切,所有按鍵一個背景呢?我認為設計師沒有足夠的理由來說服我。它只要在定義icon的時候,同步定義keyBackground,然後把keyBackground如同icon一樣作為Keyboard.Key的一個屬性,接下來的處理類似icon。這樣一來,大家皆大歡喜,豈不是很好?
從事Android開發,免不了會在應用裡嵌入一些廣告SDK,在嵌入了眾多SDK後,發現幾乎每個要求在AndroidManifest.xml申明Activity
Android提供了很多控件便於開發者進行UI相關的程序設計。但是很多時候,默認的一些UI設置不足以滿足我們的需求,要麼不好看,要麼高度不夠,亦或者是與應用界面不
本文實例講述了Android編程實現ViewPager多頁面滑動切換及動畫效果的方法。分享給大家供大家參考,具體如下: 一、首先,我們來看一下效果圖,這是新浪微博
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放