歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android 實現圖片加載效果

Android 實現圖片加載效果代碼。

先貼圖:

代碼如下:

package com.android.activity;

import java.text.DecimalFormat;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.ImageView;

/**
 * 自定義組件實現新浪微博的圖片加載效果。<br/>
 *
 *
 *
 */
public class PorterDuffView extends ImageView {
 private static final String TAG = "PorterDuffView";
 /** 前景Bitmap高度為1像素。采用循環多次填充進度區域。 */
 public static final int FG_HEIGHT = 1;
 /** 下載進度前景色 (鋪上的紅色)*/
 // public static final int FOREGROUND_COLOR = 0x77123456;
 public static final int FOREGROUND_COLOR = 0x77ff0000;
 /** 下載進度條文字顏色。 */
 public static final int TEXT_COLOR = 0xff7fff00;
 /** 進度百分比字體大小。 */
 public static final int FONT_SIZE = 30;
 private Bitmap bitmapBg, bitmapFg;
 private Paint paint;
 /** 標識當前進度。 */
 private float progress;
 /** 標識進度圖片的寬度與高度。 */
 private int width, height;
 /** 格式化輸出百分比。 */
 private DecimalFormat decFormat;
 /** 進度百分比文本的錨定Y中心坐標值。 */
 private float txtBaseY;
 /** 標識是否使用PorterDuff模式重組界面。 */
 private boolean porterduffMode;
 /** 標識是否正在下載圖片。 */
 private boolean loading;

 public PorterDuffView(Context context, AttributeSet attrs) {
  super(context, attrs);
  init(context, attrs);
 }

 /** 生成一寬與背景圖片等同高為1像素的Bitmap,。 */
 private static Bitmap createForegroundBitmap(int w) {
  Bitmap bm = Bitmap.createBitmap(w, FG_HEIGHT, Bitmap.Config.ARGB_8888);
  Canvas c = new Canvas(bm);
  Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
  p.setColor(FOREGROUND_COLOR);
  c.drawRect(0, 0, w, FG_HEIGHT, p);
  return bm;
 }

 private void init(Context context, AttributeSet attrs) {
  if (attrs != null) {
   TypedArray typedArr = context.obtainStyledAttributes(attrs,
     R.styleable.PorterDuffView);
   porterduffMode = typedArr.getBoolean(
     R.styleable.PorterDuffView_porterduffMode, false);
  }
  Drawable drawable = getDrawable();
  if (porterduffMode && drawable != null
    && drawable instanceof BitmapDrawable) {
   bitmapBg = ((BitmapDrawable) drawable).getBitmap();
   width = bitmapBg.getWidth();
   height = bitmapBg.getHeight();
   bitmapFg = createForegroundBitmap(width);//得到高度為1的紅色前景色
  } else {
   // 不符合要求,自動設置為false。
   porterduffMode = false;
  }

  paint = new Paint();
  paint.setFilterBitmap(false);
  paint.setAntiAlias(true);
  paint.setTextSize(FONT_SIZE);
  Paint.FontMetrics fontMetrics = paint.getFontMetrics();
  // 注意觀察本輸出:
  // ascent:單個字符基線以上的推薦間距,為負數
  Log.i(TAG, "ascent:" + fontMetrics.ascent//
    // descent:單個字符基線以下的推薦間距,為正數
    + " descent:" + fontMetrics.descent //
    // 單個字符基線以上的最大間距,為負數
    + " top:" + fontMetrics.top //
    // 單個字符基線以下的最大間距,為正數
    + " bottom:" + fontMetrics.bottom//
    // 文本行與行之間的推薦間距
    + " leading:" + fontMetrics.leading);
  // 在此處直接計算出來,避免了在onDraw()處的重復計算
  txtBaseY = (height - fontMetrics.bottom - fontMetrics.top) / 2;

  decFormat = new DecimalFormat("0.0%");
 }

 public void onDraw(Canvas canvas) {
  if (porterduffMode) {
   int tmpW = (getWidth() - width) / 2, tmpH = (getHeight() - height) / 2;
   // 畫出背景圖
   canvas.drawBitmap(bitmapBg, tmpW, tmpH, paint);
   // 設置PorterDuff模式
   paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));
   // canvas.drawBitmap(bitmapFg, tmpW, tmpH - progress * height,
   // paint);
   int tH = height - (int) (progress * height);
   for (int i = 0; i < tH; i++) {
    canvas.drawBitmap(bitmapFg, tmpW, tmpH + i, paint);
   }

   // 立即取消xfermode
   paint.setXfermode(null);
   int oriColor = paint.getColor();
   paint.setColor(TEXT_COLOR);
   paint.setTextSize(FONT_SIZE);
   String tmp = decFormat.format(progress);
   float tmpWidth = paint.measureText(tmp);
   canvas.drawText(decFormat.format(progress), tmpW
     + (width - tmpWidth) / 2, tmpH + txtBaseY, paint);
   // 恢復為初始值時的顏色
   paint.setColor(oriColor);
  } else {
   Log.i(TAG, "onDraw super");
   super.onDraw(canvas);
  }
 }

 public void setProgress(float progress) {
  if (porterduffMode) {
   this.progress = progress;
   // 刷新自身。
   invalidate();
  }
 }


 public boolean isLoading() {
  return loading;
 }

 public void setLoading(boolean loading) {
  this.loading = loading;
 }

 public void setPorterDuffMode(boolean bool) {
  porterduffMode = bool;
 }
}

Copyright © Linux教程網 All Rights Reserved