1. 程式人生 > >Drawable的高效用法,實現 圓角矩形,圓形

Drawable的高效用法,實現 圓角矩形,圓形

檢視原文請戳:http://blog.csdn.net/lmj623565791/article/details/43752383

1、概述

Drawable在我們平時的開發中,基本都會用到,而且給大家非常的有用。那麼什麼是Drawable呢?能夠在canvas上繪製的一個玩意,而且相比於View,並不需要去考慮measure、layout,僅僅只要去考慮如何draw(canavs)。當然了,對於Drawable傳統的用法,大家肯定不陌生 ,今天主要給大家帶來以下幾個Drawable的用法:

1、自定義Drawable,相比View來說,Drawable屬於輕量級的、使用也很簡單。以後自定義實現一個效果的時候,可以改變View first的思想,嘗試下Drawable first。

2、自定義狀態,相信大家對於State Drawable都不陌生,但是有沒有嘗試過去自定義一個狀態呢?

3、利用Drawable提升我們的UI Perfermance , 如何利用Drawable去提升我們的UI的效能。

2、Drawable基本概念

一般情況下,除了直接使用放在Drawable下的圖片,其實的Drawable的用法都和xml相關,我們可以使用shape、layer-list等標籤繪製一些背景,還可以通過selector標籤定義View的狀態的效果等。當然了基本每個標籤都對應於一個真正的實體類,關係如下:(圖片來自:Cyril Mottier :master_android_drawables)


常見的用法這裡就不舉例了,下面開始看本文的重點。

2、自定義Drawable

關於自定義Drawable,可以通過寫一個類,然後繼承自Drawable , 類似於自定義View,當然了自定義Drawable的核心方法只有一個,那就是draw。那麼自定義Drawable到底有什麼實際的作用呢?能幹什麼呢?

相信大家對於圓角、圓形圖片都不陌生,並且我曾經寫過通過自定義View實現的方式,具體可參考:

那我今天要告訴你,不需要自定義View,自定義Drawable也能實現,而且更加簡單、高效、使用範圍更廣(你可以作為任何View的背景)。

1、RoundImageDrawable

程式碼比較簡單,下面看下RoundImageDrawable

  1. package com.zhy.view;  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.BitmapShader;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.ColorFilter;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PixelFormat;  
  8. import android.graphics.RectF;  
  9. import android.graphics.Shader.TileMode;  
  10. import android.graphics.drawable.Drawable;  
  11. publicclass RoundImageDrawable extends Drawable  
  12. {  
  13.     private Paint mPaint;  
  14.     private Bitmap mBitmap;  
  15.     private RectF rectF;  
  16.     public RoundImageDrawable(Bitmap bitmap)  
  17.     {  
  18.         mBitmap = bitmap;  
  19.         BitmapShader bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP,  
  20.                 TileMode.CLAMP);  
  21.         mPaint = new Paint();  
  22.         mPaint.setAntiAlias(true);  
  23.         mPaint.setShader(bitmapShader);  
  24.     }  
  25.     @Override
  26.     publicvoid setBounds(int left, int top, int right, int bottom)  
  27.     {  
  28.         super.setBounds(left, top, right, bottom);  
  29.         rectF = new RectF(left, top, right, bottom);  
  30.     }  
  31.     @Override
  32.     publicvoid draw(Canvas canvas)  
  33.     {  
  34.         canvas.drawRoundRect(rectF, 3030, mPaint);  
  35.     }  
  36.     @Override
  37.     publicint getIntrinsicWidth()  
  38.     {  
  39.         return mBitmap.getWidth();  
  40.     }  
  41.     @Override
  42.     publicint getIntrinsicHeight()  
  43.     {  
  44.         return mBitmap.getHeight();  
  45.     }  
  46.     @Override
  47.     publicvoid setAlpha(int alpha)  
  48.     {  
  49.         mPaint.setAlpha(alpha);  
  50.     }  
  51.     @Override
  52.     publicvoid setColorFilter(ColorFilter cf)  
  53.     {  
  54.         mPaint.setColorFilter(cf);  
  55.     }  
  56.     @Override
  57.     publicint getOpacity()  
  58.     {  
  59.         return PixelFormat.TRANSLUCENT;  
  60.     }  
  61. }  

核心程式碼就是draw了,but,我們只需要一行~~~~setAlpha、setColorFilter、getOpacity、draw這幾個方法是必須實現的,不過除了draw以為,其他都很簡單。getIntrinsicWidth、getIntrinsicHeight主要是為了在View使用wrap_content的時候,提供一下尺寸,預設為-1可不是我們希望的。setBounds就是去設定下繪製的範圍。

ok,圓角圖片就這麼實現了,easy 不~~

看下用法:

  1. Bitmap bitmap = BitmapFactory.decodeResource(getResources(),  
  2.                 R.drawable.mv);  
  3.         ImageView iv = (ImageView) findViewById(R.id.id_one);  
  4.         iv.setImageDrawable(new RoundImageDrawable(bitmap));  

ok,貼一下我們的效果圖,兩個ImageView和一個TextView


可以看到,不僅僅用於ImageView去實現圓角圖片,並且可以作為任何View的背景,在ImageView中的拉伸的情況,配下ScaleType即可。在其他View作為背景時,如果出現拉伸情況,請參考:Android BitmapShader 實戰 實現圓形、圓角圖片 。 足夠詳細了。

2、CircleImageDrawable

那麼下來,我們再看看自定義圓形Drawable的寫法:

  1. package com.zhy.view;  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.BitmapShader;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.ColorFilter;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PixelFormat;  
  8. import android.graphics.RectF;  
  9. import android.graphics.Shader.TileMode;  
  10. import android.graphics.drawable.Drawable;  
  11. publicclass CircleImageDrawable extends Drawable  
  12. {  
  13.     private Paint mPaint;  
  14.     privateint mWidth;  
  15.     private Bitmap mBitmap ;   
  16.     public CircleImageDrawable(Bitmap bitmap)  
  17.     {  
  18.         mBitmap = bitmap ;   
  19.         BitmapShader bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP,  
  20.                 TileMode.CLAMP);  
  21.         mPaint = new Paint();  
  22.         mPaint.setAntiAlias(true);  
  23.         mPaint.setShader(bitmapShader);  
  24.         mWidth = Math.min(mBitmap.getWidth(), mBitmap.getHeight());  
  25.     }  
  26.     @Override
  27.     publicvoid draw(Canvas canvas)  
  28.     {  
  29.         canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2, mPaint);  
  30.     }  
  31.     @Override
  32.     publicint getIntrinsicWidth()  
  33.     {  
  34.         return mWidth;  
  35.     }  
  36.     @Override
  37.     publicint getIntrinsicHeight()  
  38. 相關推薦

    Drawable高效用法,實現 圓角矩形,圓形

    檢視原文請戳:http://blog.csdn.net/lmj623565791/article/details/43752383 1、概述 Drawable在我們平時的開發中,基本都會用到,而且給大家非常的有用。那麼什麼是Drawable呢?能夠在canva

    Android 使用Drawable實現圓角圓形圖案

    第一步:建立類RoundCircleDrawable繼承Drawable /** * 圓角矩形 * @Project App_View * @Package com.android.view.drawable * @author

    在firefox中用CSS實現圓角矩形

    2006-10-25 測試. 這是周海漢寫的圓角矩形測試,用CSS,但只有firefox支援,IE不支援。 <style type="text/css"> .item { border: #ff0000 1

    微信小程式實現圓角矩形按鈕

    在微信小程式的開發當中,為了介面的美觀,我們通常需要修改原始按鈕的css樣式,下面教大家如何將按鈕改成圓角矩形 首先將按鈕原始邊框關閉,然後設定按鈕的的弧度,css如下: button

    css用邊框實現圓角矩形

         今天要做一個圓角矩形的按鈕,於是直接找圓角矩形的css實現方式,搞了半天,雖然也實現效果了,但是很複雜,需要用很多程式碼,後來突然想到以前做過的一個邊框效果,也是圓角矩形,於是找了出來,發現這種辦法相當簡單並且效果一點也不差,這裡簡要分享一下。       關鍵部

    SurfaceView實現圓角矩形預覽

    android中,文字、按鈕實現圓角樣式只需要在其背景中定義corners屬性設定radius即可。 在SurfaceView中同樣可以實現此種效果,以豐富預覽樣式。 比如用SurfaceView要實現圓角矩形預覽的效果,自定義View繼承於SurfaceView,然後重

    使用CardView實現圓角圓形的效果

    前言 CardView是Android 5.0 中一種全新的控制元件,可以實現圓角和陰影效果。 新增依賴 compile ‘com.android.support:cardview-v7:23.4.0’ 開始使用 CardView是一個新增的U

    Bootstrap—實現圓角圓形頭像和響應式圖片

    Bootstrap提供了四種用於<img>類的樣式,分別是: .img-rounded:圓角 (IE8 不支援),新增border-radius:6px來獲得圖片圓角; .img-circle:圓形 (IE8 不支援),新增border-radius:50%來讓

    Css樣式+div實現圓角矩形

    一、CSS樣式 實現圓角矩形,增加背景顏色,以及邊框顏色 .css1{ background: #86c7ff; width: 100%; font-size: 18px; color: #5f84a8; border: 1px #568bb9

    CSS 邊框實現圓角矩形

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> &

    使用Glide載入圓角矩形圖片、圓形圖片

    Glide是一個功能強大的圖片載入庫,下面是平常開發中使用到的一些功能,基於Glide-4.X版本的用法 Glide-github地址 Glide jar包下載地址 載入圓形圖片: RequestOptions mRequestOptions = RequestOptions.cir

    Android 完美實現圖片圓角圓形實現進行分析

                    轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/24555655本來想在網上找個圓角的例子看一看,不盡人意啊,基本都是官方的Demo的那張原理圖,稍後會貼出。於是自己自定義了個View,實現圖片的圓角以及圓形效

    android開源專案---RoundedImageView製作圓角矩形,橢圓形以其圓形控制元件

    一、專案概述 在專案中美工提供給我們的圖片通常是矩形的,我們如何把矩形的圖片做成圓角矩形、橢圓形以其圓形效果的圖形顯示效果,這就是我這篇文章要講的內容。 效果如下: 我這裡使用的是開源專案  RoundedImageView 二、搭建RoundedImageVi

    android圓角矩形框xml的實現

    設定邊框圓角可以在drawable-mdpi目錄裡定義一個xml:  <?xml version="1.0" encoding="utf-8"?>   <shape xmlns:android="http://schemas.android.com

    Android中圓角圓形圖片的實現

    android圖片的圓形圓角圖片的設計有多種方式 1、使用框架 2、自定義元件 3、圖片剪下 下面從最簡單的框架開始介紹 1、使用框架, Fresco是Facebook提供的開源圖片載入庫,Fresco中實現了各種載入過程以及載入後的圖片繪製,整體都很強大。 下面簡單介紹

    Android 圓角圓形 ImageView 實現

    一、 特點基於AppCompatImageView擴充套件支援圓角、圓形顯示可繪製邊框,圓形時可繪製內外兩層邊框支援邊框不覆蓋圖片可繪製遮罩......二、基本原理我們要實現的圖片控制元件繼承自AppCompatImageView,它是ImageView的子類,但提供了更好的相容性,我們在此基礎上添加了若干自

    Android安卓自定義圓角矩形控制元件,省去定義drawable裡面xml的麻煩,輕鬆程式設計

    1、背景 我們的專案的設計師喜歡用圓角矩形背景作為設計元素,而且顏色、樣式各不一樣導致專案工程裡面定義了大量的xml檔案,為了消除這一現象,我想到自定義控制元件解決這個問題。 圖1、專案中使用大量的xml定義圓角矩形 2、看看效果 先看效果         圖2自定義圓

    抽象類,實現矩形圓形、三角形的面積計算。

    package Abstrace;import Abstrace.Circle;import Abstrace.Rectangle;import Abstrace.Shape;import Abstrace.Triangle;//定義一個抽象類abstract class S

    UILabel簡單高效實現圓角的方式

    需求 我們會經常遇到這樣一個需求,給TableViewCell新增標籤,例如:餓了麼App中店鋪會有,減、特、新等標籤,這些標籤一般都是用UILabel控制元件實現,UILabel中設定text,textColor,backgroundColor,以及cornerRadius。 餓了麼示例.PNG 問題

    Android 繪製圓角圖片(圓形圖片,圓角矩形圖片,圓角正方形圖片)【轉】

    我們在Android應用中經常要繪製圓角的圖片來展示一些背景圖,但是每次都製作圓角的圖片很麻煩,而且重複使用率不高。所以我們最好的就是在應用中根據已有的圖片,動態的繪製所需要的圓角圖片用於顯示。話不多說,讓我們先看看效果圖: 這是例子中使用到的圖