Android dialog圓角顯示及解決出現的黑色棱角

最近在開發一個天氣預報的app,看到一個比較不錯友情提示,以下:android

                 

怎麼樣,看起來比原始的dialog好看吧.好了,作法也許有不少,我介紹下個人作法吧,canvas

 首先,我第一個想到的就是重寫dialog.自定義一個layout佈局,引用shape.xml實現圓角。app

 

 在此以前,我要說明一下:在咱們新建的佈局文件,只要不是最外層咱們引用shape就不會遇到下面這個問題,看圖:佈局

         

    仔細看就是四個角,發現出現四個黑棱角,這個確定使咱們不想要的結果,我在配置文件中怎麼設置都不行,鬱悶了很久,忽然發現以前作過dialog顯示圖片 的效果,找了一下例子,原來真的作過,看來我真的不適合作程序啊,努力賺錢作生意去.說的好像跑偏了,說正題:解決方法就是:getWindow().setBackgroundDrawable(new BitmapDrawable()); 或者getWindow().setBackgroundDrawableResource(android.R.color.transparent);這樣就不會出現四個黑棱角了.spa

   這個時候咱們解決棱角了,又有一個問題,你會發現你在配置文件中,設置中間某個佈局的背景顏色的時候,這個圓角會被吞噬,解決方法咱們能夠在shape中設置中間填充顏色,對於中間的部分咱們能夠在佈局文件中設置,由於中間她影響不到圓角,哈哈這樣就實現最終效果了.若是有人要說,那我實現三種顏色多種顏色怎麼辦,其實咱們也能夠分開shape,不是嗎,就是麻煩點,不過確定能夠實現.code

  

看起來效果還能夠吧,不過如今還正在完善.xml

該睡覺了,就說到這了,也許我講的都是些廢話,不過我在這上面卡三次,作過了都不知道,寫下來加深記憶。blog

/*************************************************************************************/圖片

上面介紹的是自定義dialog來實現.下面咱們在來看一個示例.ip

         

這是我如今項目中開發的一個視圖,樣式尚未進行處理,因此不免有些粗糙.(至於緣由:有太小公司開發經驗的朋友,你懂的.)

實現方法咱們徹底能夠用上面自定義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做爲單位,都引用這個這個大小.

相關文章
相關標籤/搜索