android dialog圓角顯示及解決出現的黑色稜角
http://blog.csdn.net/jj120522/article/details/7871289
最近在開發一個天氣預報的app,看到一個比較不錯友情提示,如下:
怎麼樣,看起來比原始的dialog好看吧.好了,做法也許有很多,我介紹下我的做法吧,
首先,我第一個想到的就是重寫dialog.自定義一個layout佈局,引用shape.xml實現圓角。
在此之前,我要說明一下:在我們新建的佈局檔案,只要不是最外層我們引用shape就不會遇到下面這個問題,看圖:
仔細看就是四個角,發現出現四個黑稜角,這個肯定使我們不想要的結果,我在配置檔案中怎麼設定都不行,鬱悶了好久,突然發現之前做過dialog顯示圖片的效果,找了一下例子,原來真的做過,看來我真的不適合做程式啊,努力賺錢做生意去.說的好像跑偏了,說正題:解決方法就是:getWindow().setBackgroundDrawable(new BitmapDrawable()); 或者getWindow().setBackgroundDrawableResource(android.R.color.transparent); 這樣就不會出現四個黑稜角了.
這個時候我們解決稜角了,又有一個問題,你會發現你在配置檔案中,設定中間某個佈局的背景顏色的時候,這個圓角會被吞噬,解決方法我們可以在shape中設定中間填充顏色,對於中間的部分我們可以在佈局檔案中設定,因為中間她影響不到圓角,哈哈這樣就實現最終效果了.如果有人要說,那我實現三種顏色多種顏色怎麼辦,其實我們也可以分開shape,不是嗎,就是麻煩點,不過肯定可以實現.
看起來效果還可以吧,不過現在還正在完善.
該睡覺了,就說到這了,也許我講的都是些廢話,不過我在這上面卡三次,做過了都不知道,寫下來加深記憶。
/*************************************************************************************/
上面介紹的是自定義dialog來實現.下面我們在來看一個示例.
這是我現在專案中開發的一個檢視,樣式還沒有進行處理,所以難免有些粗糙.(至於原因:有過小公司開發經驗的朋友,你懂的.)
實現方法我們完全可以用上面自定義dialog完全可以做到.不過自定義有個缺點就是你必須整合到她的父檢視中.因為用到環境變數Context. 或許你可以做到很好的分層.還有這裡面也涉及了比較多的介面操作.就類似於一個mini的Activity.這裡我們用另外一種簡單的方法實現:改變Activity的Style.
在style檔案中自定義一個樣式.
- <style name="Theme.HalfScreen" parent="android:style/Theme.Dialog"></style>
在Activity中引用:
- <activity
- android:name=".MemberActivity"
- android:screenOrientation="portrait"
- android:theme="@style/Theme.HalfScreen" />
首先我們要在xml中定義檢視:(這裡我將樣式copy出來.這樣比密密麻麻一坨程式碼看起來舒服點.)
不知道大家注意到沒.她的四周都是圓角.正是這個圓角給這個mini版的Activity增加了獨有特色.下面我簡單說明下具體實現:
首先佈局的圓角大家可以自定一個背景xml檔案
- <?xml version="1.0" encoding="utf-8"?>
- <shape xmlns:android="http://schemas.android.com/apk/res/android" >
- <corners android:radius="10dp" />
- <solid android:color="@color/white" />
- </shape>
這樣還沒有完,這樣我們只能得到下半部分是個圓角,而上半部分並非圓角,因為上部是一個圖片.這裡通過配置檔案是做不到的,我們需要在程式碼中隊圖片進行處理.目的:圖片上半部分為圓角.
程式碼片段:
- /***
- * 圖片切圓角,方向自由.
- */
- public static final int ALL = 347120;
- public static final int TOP = 547120;
- public static final int LEFT = 647120;
- public static final int RIGHT = 747120;
- public static final int BOTTOM = 847120;
- public static Bitmap fillet(int type,Bitmap bitmap,int roundPx) {
- try {
- // 其原理就是:先建立一個與圖片大小相同的透明的Bitmap畫板
- // 然後在畫板上畫出一個想要的形狀的區域。
- // 最後把源圖片帖上。
- final int width = bitmap.getWidth();
- final int height = bitmap.getHeight();
- Bitmap paintingBoard = Bitmap.createBitmap(width,height, Config.ARGB_8888);
- Canvas canvas = new Canvas(paintingBoard);
- canvas.drawARGB(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);
- final Paint paint = new Paint();
- paint.setAntiAlias(true);
- paint.setColor(Color.BLACK);
- if( TOP == type ){
- clipTop(canvas,paint,roundPx,width,height);
- }else if( LEFT == type ){
- clipLeft(canvas,paint,roundPx,width,height);
- }else if( RIGHT == type ){
- clipRight(canvas,paint,roundPx,width,height);
- }else if( BOTTOM == type ){
- clipBottom(canvas,paint,roundPx,width,height);
- }else{
- clipAll(canvas,paint,roundPx,width,height);
- }
- paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
- //帖子圖
- final Rect src = new Rect(0, 0, width, height);
- final Rect dst = src;
- canvas.drawBitmap(bitmap, src, dst, paint);
- return paintingBoard;
- } catch (Exception exp) {
- return bitmap;
- }
- }
- private static void clipLeft(final Canvas canvas,final Paint paint,int offset,int width,int height){
- final Rect block = new Rect(offset,0,width,height);
- canvas.drawRect(block, paint);
- final RectF rectF = new RectF(0, 0, offset * 2 , height);
- canvas.drawRoundRect(rectF, offset, offset, paint);
- }
- private static void clipRight(final Canvas canvas,final Paint paint,int offset,int width,int height){
- final Rect block = new Rect(0, 0, width-offset, height);
- canvas.drawRect(block, paint);
- final RectF rectF = new RectF(width - offset * 2, 0, width , height);
- canvas.drawRoundRect(rectF, offset, offset, paint);
- }
- private static void clipTop(final Canvas canvas,final Paint paint,int offset,int width,int height){
- final Rect block = new Rect(0, offset, width, height);
- canvas.drawRect(block, paint);
- final RectF rectF = new RectF(0, 0, width , offset * 2);
- canvas.drawRoundRect(rectF, offset, offset, paint);
- }
- private static void clipBottom(final Canvas canvas,final Paint paint,int offset,int width,int height){
- final Rect block = new Rect(0, 0, width, height - offset);
- canvas.drawRect(block, paint);
- final RectF rectF = new RectF(0, height - offset * 2 , width , height);
- canvas.drawRoundRect(rectF, offset, offset, paint);
- }
- private static void clipAll(final Canvas canvas,final Paint paint,int offset,int width,int height){
- final RectF rectF = new RectF(0, 0, width , height);
- canvas.drawRoundRect(rectF, offset, offset, paint);
- }
先宣告,這段程式碼是copy他人的.寫的相當的清晰,我就直接拿來用了.
這裡你要注意一個值roundPx.看下面這張圖(上部圓角).
也許有的朋友們已經明白,那個白色是我們底部圓角佈局.因為此時(圖片圓角弧度>底部圓角佈局.)所以就會 出現這種現象,解決方法很簡單,你可以讓圖片圓角弧度小於底部圓角佈局圓角即可,或者為了更為準確,你可以都用px作為單位,都引用這個這個大小.
相關文章
- Android 圓角、圓形 ImageView 實現AndroidView
- 在相親原始碼開發中,如何實現圓角及特殊圓角的使用?原始碼
- android 螢幕圓角實現方法Android
- Android Xfermode 實戰 實現圓形、圓角圖片Android
- UIImageView 實現圓角效果UIView
- Android 實現一個通用的圓角佈局Android
- AndroidTips:解決Dialog全屏顯示以及Dialog顯示自動彈出輸入法Android
- 解決iPhone 瀏覽器上的圓角問題iPhone瀏覽器
- android 圓角圖片 處理Android
- CSS3圓角詳解CSSS3
- visio圓角矩形怎麼改變圓角大小
- JavaScript 動畫方式彈出圓角框JavaScript動畫
- Android在Dialog中顯示PopupWindow不全問題解決Android
- CSS不用背景圖片實現優惠券樣式反圓角,凹圓角,反向半圓角,並且背景漸變CSS
- 相容所有瀏覽器的圓角出效果瀏覽器
- php短視訊原始碼,按鈕的圓角圖示實現PHP原始碼
- css實現圓角按鈕效果CSS
- iOS 實現檢視指定圓角iOS
- Winform窗體圓角以及描邊完美解決方案ORM
- Flutter 圓形/圓角頭像Flutter
- Flutter 彩邊圓角 Container 的實現FlutterAI
- Android學習之 圓角邊框的幾種實現方式Android
- CSS 文字框圓角CSS
- AUTOCAD——圓角命令
- iOS 繪製圓角iOS
- PHP合成圖圓角PHP
- css3圓角CSSS3
- Android 開發:glide圓角,圓形,效率問題AndroidIDE
- CSS 奇思妙想 | 巧妙的實現帶圓角的三角形CSS
- 視訊: iphone式圓角圖示製作教程iPhone
- 自定義drawable實現圓角圖片
- 自定義view實現圓角圖片View
- 筆記-iOS設定圓角方法以及指定位置設圓角筆記iOS
- 利用DOTNETBAR製作圓角窗體和圓角控制元件控制元件
- 使用 RoundedBitmapDrawable 建立圓角頭像詳解
- WPF之小米Logo超圓角的實現Go
- css3實現的矩形圓角切角效果CSSS3
- [Android] 定製化Toast展示(位置、底色、圓角)AndroidAST