Android 使用Universal Image Loader繪製帶圓角的圖片(一)

來源:互聯網
上載者:User

標籤:

Android 使用Universal Image Loader繪製帶圓角的圖片(一)
  • 繪製帶圓角的控制項難嗎?貌似不難。對於一個普通layout或者widget,要繪製圓角,只要把 background設定成下面這樣的drawable就行了。

      <?xml version="1.0" encoding="utf-8"?>  <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">  <!-- 填充的顏色 -->  <solid android:color="@color/pure_white" />  <!-- 設定按鈕的四個角為弧形 -->  <!-- android:radius 弧形的半徑 -->  <corners android:radius="@dimen/small_corner_radius" />  </shape>

    但是,對於圖片控制項ImageView,這種方法卻會沒有效果。要想知道原因,就得看android源碼。首先看看ImageView是如何設定Bitmap的。

      public void setImageBitmap(Bitmap bm) {      // if this is used frequently, may handle bitmaps explicitly      // to reduce the intermediate drawable object      setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));  }

    哦,它通過Bitmap建立了一個BitmapDrawable。那BitmapDrawable幹了啥呢?

      @Override  public void draw(Canvas canvas) {      Bitmap bitmap = mBitmap;      if (bitmap != null) {          final BitmapState state = mBitmapState;          if (state.mRebuildShader) {              ......              if (tmx == null && tmy == null) {                  state.mPaint.setShader(null);              } else {                  state.mPaint.setShader(new BitmapShader(bitmap,                          tmx == null ? Shader.TileMode.CLAMP : tmx,                          tmy == null ? Shader.TileMode.CLAMP : tmy));              }              .......              copyBounds(mDstRect);          }         Shader shader = state.mPaint.getShader();          final boolean needMirroring = needMirroring();          if (shader == null) {              ......              canvas.drawBitmap(bitmap, null, mDstRect, state.mPaint);              if (needMirroring) {                  canvas.restore();              }          } else {              ......              canvas.drawRect(mDstRect, state.mPaint);          }      }  }

    注意紅色的代碼,可以大概知道,這裡僅僅把圖片繪製到了一個固定的矩形框中,所以圖片部分還是矩形。

    那麼該如何解決這個問題呢?還好並不複雜,看看十分流行的UIL(Universal Image Loader https://github.com/nostra13/Android-Universal-Image-Loader )是怎麼做的。答案就在它的RoundedBitmapDisplayer.java中的RoundedDrawable類。

      public static class RoundedDrawable extends Drawable {  public RoundedDrawable(Bitmap bitmap, int cornerRadius, int margin, ViewScaleType scaleType)   {      this.cornerRadius = cornerRadius;      this.margin = margin;      bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);      mBitmapRect = new RectF (margin, margin, bitmap.getWidth() - margin, bitmap.getHeight() - margin);      paint = new Paint();      paint.setAntiAlias(true);      paint.setShader(bitmapShader);      mScaleType = scaleType;  }  @Override  public void draw(Canvas canvas)  {      canvas.drawRoundRect(mRect, cornerRadius, cornerRadius, paint);      //canvas.drawRect(mDstRect, state.mPaint); ImageView的繪製方法?}  }

    我只貼出了構造器和draw兩個方法。構造器的代碼錶明它也是用BitmapShader來進行圖片的繪製的,和ImageView的區別就在於,它是用drawRoundRect的方法來進行繪製的。所以它可以繪製出圓角的圖片。

Edit By MaHua

Android 使用Universal Image Loader繪製帶圓角的圖片(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.