Android的图像处理类Bitmap各种功能实现的详细介绍

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。

一、Bitmap的生成

1.1 BitmapFactory decode出Bitmap

    Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。

Android图像处理之Bitmap类

图一、BitmapFactory主要方法及Options选项

 

利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。

 

1.2 decode时的选项

在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options

利用Options的下列属性,可以指定decode的选项:

  • inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
  • inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
  • inSampleSize 设置decode时的缩放比例。

 

利用Options的这些值就可以高效的得到一幅缩略图。

Android图像处理之Bitmap类

图二、BitmapFactory.decodeFile()

先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息[Step#2~4];

利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据[Step#5~8]。

先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。

 

二、利用Bitmap和Matrix实现图像变换

    Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。

Android图像处理之Bitmap类

图三、Bitmap方法

用源Bitmap通过变换生成新的Bitmap的方法:

1public static Bitmap createBitmap(Bitmap source, int x, inty, intwidth,intheight,  
2            Matrix m,booleanfilter)  
3public static Bitmap createBitmap(Bitmap source, int x, inty, intwidth,intheight)  
4public static Bitmap createScaledBitmap(Bitmap src, intdstWidth,  
5            intdstHeight,booleanfilter)

第一个方法是最终的实现,后两种只是对第一种方法的封装。

第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。

 

设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。

Android图像处理之Bitmap类

图四、Bitmap实现旋转

 

三、保存图像文件

    经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。

Android图像处理之Bitmap类

图五、保存Bitmap数据到文件

 

这个操作过程中,Bitmap.compress()方法的参数format可设置JPEG或PNG格式;quality可选择压缩质量;fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。

 

总结一下,本文介绍Bitmap的使用方法——用Bitmap实现图像文件的读取和写入,并用Bitmap实现图像的剪切、旋转和缩放变换。

=================================================================================================================================

android 实现图片的翻转

 
1Resources res = this.getContext().getResources();
2        img = BitmapFactory.decodeResource(res, R.drawable.aa);
3        Matrix matrix =newMatrix(); 
4        matrix.postRotate(180);       /*翻转180度*/
5        intwidth = img.getWidth();
6        intheight = img.getHeight();
7        img_a = Bitmap.createBitmap(img,0,0, width, height, matrix,true);

然后可以直接把img_a draw到画布上,canvas.drawBitmap(img_a, 10, 10, p);

Matrix 是一个处理翻转、缩放等图像效果的重要类

Matrix.postScale 可设置缩放比例,默认为1

**********************************************************************
android 实现图片的旋转

 
01public class ex04_22 extendsActivity{
02     
03private ImageView mImageView;
04private Button btn1,btn2;
05private TextView mTextView;
06private AbsoluteLayout layout1;
07private int ScaleTimes=1,ScaleAngle=1;
08    @Override
09    publicvoidonCreate(Bundle savedInstanceState) {
10        super.onCreate(savedInstanceState);
11        setContentView(R.layout.main);
12        mImageView=(ImageView)findViewById(R.id.myImageView);
13        finalBitmap bmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1);
14        finalintwidthOrig=bmp.getWidth();
15        finalintheightOrig=bmp.getHeight();
16        mImageView.setImageBitmap(bmp);
17        btn1=(Button)findViewById(R.id.myButton1);
18        btn1.setOnClickListener(newOnClickListener(){
19         publicvoidonClick(View v){
20          ScaleAngle--;
21          if(ScaleAngle<-60){
22           ScaleAngle=-60;
23          }
24          intnewWidth=widthOrig*ScaleTimes;
25          intnewHeight=heightOrig*ScaleTimes;
26          floatscaleWidth=((float)newWidth)/widthOrig;
27          floatscaleHeight=((float)newHeight)/heightOrig;
28          Matrix matrix=newMatrix();
29          matrix.postScale(scaleWidth, scaleHeight);
30          matrix.setRotate(5*ScaleAngle);
31          Bitmap resizeBitmap=Bitmap.createBitmap(bmp,0,0, widthOrig, heightOrig, matrix,true);
32          BitmapDrawable myNewBitmapDrawable=newBitmapDrawable(resizeBitmap);
33          mImageView.setImageDrawable(myNewBitmapDrawable);
34         }
35        });
36        btn2=(Button)findViewById(R.id.myButton2);
37        btn2.setOnClickListener(newOnClickListener(){
38         publicvoidonClick(View v){
39          ScaleAngle++;
40          if(ScaleAngle>60){
41           ScaleAngle=60;
42          }
43          intnewWidth=widthOrig*ScaleTimes;
44          intnewHeight=heightOrig*ScaleTimes;
45          floatscaleWidth=((float)newWidth)/widthOrig;
46          floatscaleHeight=((float)newHeight)/heightOrig;
47          Matrix matrix=newMatrix();
48          matrix.postScale(scaleWidth, scaleHeight);
49          matrix.setRotate(5*ScaleAngle);
50          Bitmap resizeBitmap=Bitmap.createBitmap(bmp,0,0, widthOrig, heightOrig, matrix,true);
51          BitmapDrawable myNewBitmapDrawable=newBitmapDrawable(resizeBitmap);
52          mImageView.setImageDrawable(myNewBitmapDrawable);
53         }
54        });
55    }

**********************************************************************

实现画面淡入淡出效果可以用 :setAlpha(alpha); 
alpha从255,逐渐递减!

**********************************************************************

如何实现屏幕的滚动效果,这里有两个关键点,一个是实现OnGestureListener,

以便在触摸事件发生的时候,被回调。包括按下,滚动等等,按照API文档,

需要分两步来实现检测手势行为。

1)创建GestureDetector实例

2) 在onTouchEvent()方法中调用GestureDetector的onTouchEvent()方法。

另一个关键点是自己实现一个简单的View,来绘制图片。

代码如下所示。由于,我们不需要使用layout定义,所以不需要提供xml文件。
直接在程序里面setContentView()即可。

 
001package com.j2medev;
002  
003import android.app.Activity;
004import android.content.Context;
005import android.content.res.Resources;
006import android.graphics.Bitmap;
007import android.graphics.BitmapFactory;
008import android.graphics.Canvas;
009import android.graphics.Paint;
010import android.os.Bundle;
011import android.view.GestureDetector;
012import android.view.MotionEvent;
013import android.view.View;
014import android.view.ViewGroup;
015import android.view.GestureDetector.OnGestureListener;
016  
017public class HorizontalScroll extendsActivityimplementsOnGestureListener {
018private static final int X_MAX = 800;
019private static final int Y_MAX = 600;
020private int scrollX = 0;
021private int scrollY = 0;
022  
023MyView main;
024Bitmap bmp;
025Bitmap adapt;
026Resources res;
027Paint paint;
028GestureDetector gestureScanner;
029  
030@Override
031public void onCreate(Bundle savedInstanceState) {
032super.onCreate(savedInstanceState);
033  
034gestureScanner = newGestureDetector(this);
035paint = newPaint();
036  
037res = getResources();
038bmp = BitmapFactory.decodeResource(res, R.drawable.arc);
039adapt = Bitmap.createBitmap(bmp);
040  
041main = newMyView(this);
042setContentView(main, newViewGroup.LayoutParams(800,600));
043}
044  
045@Override
046public boolean onTouchEvent(MotionEvent me) {
047return gestureScanner.onTouchEvent(me);
048}
049  
050public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
051   floatdistanceY) {
052main.handleScroll(distanceX, distanceY);
053return true;
054}
055  
056public boolean onDown(MotionEvent e) {
057return true;
058}
059  
060public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
061   floatvelocityY) {
062return true;
063}
064  
065public void onLongPress(MotionEvent e) {
066}
067  
068public void onShowPress(MotionEvent e) {
069}
070  
071public boolean onSingleTapUp(MotionEvent e) {
072return true;
073}
074  
075// //
076// /
077//
078  
079class MyView extends View {
080public MyView(Context context) {
081   super(context);
082}
083  
084@Override
085protected void onDraw(Canvas canvas) {
086   canvas.drawBitmap(adapt, -scrollX, -scrollY, paint);
087}
088  
089public void handleScroll(floatdistX,float distY) {
090   // X-Axis
091  
092   if(distX >6.0) {
093    if(scrollX <460) {
094     scrollX +=15;
095    }
096   else if (distX < -6.0) {
097    if(scrollX >=15) {
098     scrollX -=15;
099    }
100   }
101   // //
102  
103   // Y-AXIS //
104   if(distY >6.0) {
105    if(scrollY <100) {
106     scrollY +=15;
107    }
108   else if (distY < -6.0) {
109    if(scrollY >=15) {
110     scrollY -=15;
111    }
112   }
113   // //
114   //
115   // if ((scrollX <= 480) && (scrollY <= 120)) {
116   // adapt = Bitmap.createBitmap(bmp, scrollX, scrollY, 320, 480);
117   // invalidate();
118   // }
119   invalidate();
120}
121}
122}

**********************************************************************

教你在谷歌Android平台中处理图片

操作图像像素

现在你可以对单独的像素进行处理了。通过使用android.graphics.Bitmap API中的

getPixels,可以加载像素到一个整数数组中。在本文例子中,你将按照一定规则对每一

个像素实现着色。经过这个处理后,所有的像素将被转化为一个范围在0到255的字节码。

android.graphics.Bitmap API中的setPixels则用来加载这个整数数组到一个图像中。

最后一步是通过ImageView变量mIV来更新屏幕。以下是实现这个染色过程的代码片段。

 
01private void TintThePicture(intdeg) {
02   int[] pix =newint[picw * pich];
03   mBitmap.getPixels(pix,0, picw,0,0, picw, pich);
04  
05   intRY, GY, BY, RYY, GYY, BYY, R, G, B, Y;
06   doubleangle = (3.14159d * (double)deg) /180.0d;
07   intS = (int)(256.0d * Math.sin(angle));
08   intC = (int)(256.0d * Math.cos(angle));
09  
10    for(inty = 0; y < pich; y++)
11    for(intx = 0; x < picw; x++)
12       {
13       intindex = y * picw + x;
14       intr = (pix[index] >>16) &0xff;
15       intg = (pix[index] >>8) &0xff;
16       intb = pix[index] &0xff;
17       RY = (70* r - 59* g -11 * b) / 100;
18       GY = (-30* r +41 * g - 11* b) / 100;
19       BY = (-30* r -59 * g + 89* b) / 100;
20       Y = (30* r + 59* g +11 * b) / 100;
21       RYY = (S * BY + C * RY) /256;
22       BYY = (C * BY - S * RY) /256;
23       GYY = (-51* RYY -19 * BYY) / 100;
24       R = Y + RYY;
25       R = (R <0) ?0: ((R > 255) ?255: R);
26       G = Y + GYY;
27       G = (G <0) ?0: ((G > 255) ?255: G);
28       B = Y + BYY;
29       B = (B <0) ?0: ((B > 255) ?255: B);
30       pix[index] =0xff000000| (R <<16) | (G <<8) | B;
31       }
32   
33    Bitmap bm = Bitmap.createBitmap(picw, pich,false);
34    bm.setPixels(pix,0, picw,0,0, picw, pich);
35   
36    // Put the updated bitmap into the main view
37    mIV.setImageBitmap(bm);
38    mIV.invalidate();
39   
40    mBitmap = bm;
41    pix =null;
42 }

**********************************************************************

android 图片的放大和缩小

 
01public class ex04_22 extendsActivity{
02private ImageView mImageView;
03private Button btn1,btn2;
04private TextView mTextView;
05private AbsoluteLayout layout1;
06private Bitmap bmp;
07private int id=0;
08private int displayWidth,displayHeight;
09private float scaleWidth=1,scaleHeight=1;
10private final static String filename="/data/data/ex04_22.lcs/ex04_22_2.png";
11@Override
12public void onCreate(Bundle savedInstanceState) {
13super.onCreate(savedInstanceState);
14setContentView(R.layout.main);
15//取得屏幕分辨率
16DisplayMetrics dm=newDisplayMetrics();
17getWindowManager().getDefaultDisplay().getMetrics(dm);
18displayWidth=dm.widthPixels;
19displayHeight=dm.heightPixels-80;
20bmp=BitmapFactory.decodeResource(this.getResources(),R.drawable.ex04_22_1);
21layout1=(AbsoluteLayout)findViewById(R.id.layout1);
22mImageView=(ImageView)findViewById(R.id.myImageView);
23btn1=(Button)findViewById(R.id.myButton1);
24btn1.setOnClickListener(newOnClickListener(){
25public void onClick(View v){
26small();
27}
28});
29btn2=(Button)findViewById(R.id.myButton2);
30btn2.setOnClickListener(newOnClickListener(){
31public void onClick(View v){
32big();
33}
34});
35}
36private void small(){
37//获得Bitmap的高和宽
38int bmpWidth=bmp.getWidth();
39int bmpHeight=bmp.getHeight();
40//设置缩小比例
41double scale=0.8;
42//计算出这次要缩小的比例
43scaleWidth=(float)(scaleWidth*scale);
44scaleHeight=(float)(scaleHeight*scale);
45//产生resize后的Bitmap对象
46Matrix matrix=newMatrix();
47matrix.postScale(scaleWidth, scaleHeight);
48Bitmap resizeBmp=Bitmap.createBitmap(bmp,0,0, bmpWidth, bmpHeight, matrix,true);
49if(id==0){
50layout1.removeView(mImageView);
51}
52else{
53layout1.removeView((ImageView)findViewById(id));
54}
55id++;
56ImageView imageView=newImageView(this);
57imageView.setId(id);
58imageView.setImageBitmap(resizeBmp);
59layout1.addView(imageView);
60setContentView(layout1);
61btn2.setEnabled(true);
62}
63private void big(){
64//获得Bitmap的高和宽
65int bmpWidth=bmp.getWidth();
66int bmpHeight=bmp.getHeight();
67//设置缩小比例
68double scale=1.25;
69//计算出这次要缩小的比例
70scaleWidth=(float)(scaleWidth*scale);
71scaleHeight=(float)(scaleHeight*scale);
72//产生resize后的Bitmap对象
73Matrix matrix=newMatrix();
74matrix.postScale(scaleWidth, scaleHeight);
75Bitmap resizeBmp=Bitmap.createBitmap(bmp,0,0, bmpWidth, bmpHeight, matrix,true);
76if(id==0){
77layout1.removeView(mImageView);
78}
79else{
80layout1.removeView((ImageView)findViewById(id));
81}
82id++;
83ImageView imageView=newImageView(this);
84imageView.setId(id);
85imageView.setImageBitmap(resizeBmp);
86layout1.addView(imageView);
87setContentView(layout1);
88if(scaleWidth*scale*bmpWidth>displayWidth||scaleHeight*scale*scaleHeight>displayHeight){
89btn2.setEnabled(false);
90}
91}
92}

xml文件

 
01<?xmlversion="1.0"encoding="utf-8"?>
02  
03<AbsoluteLayout
04android:id="@+id/layout1"
05android:layout_width="fill_parent"
06android:layout_height="fill_parent"
07xmlns:android="http://schemas.android.com/apk/res/android"
08>
09<ImageView
10android:id="@+id/myImageView"
11android:layout_width="200px"
12  
13android:layout_height="150px"
14android:src="@drawable/ex04_22_1"
15android:layout_x="0px"
16android:layout_y="0px"
17>
18</ImageView>
19<Button
20android:id="@+id/myButton1"
21  
22android:layout_width="90px"
23android:layout_height="60px"
24android:text="缩小"
25android:textSize="18sp"
26android:layout_x="20px"
27android:layout_y="372px"
28  
29>
30</Button>
31<Button
32android:id="@+id/myButton2"
33android:layout_width="90px"
34android:layout_height="60px"
35android:text="放大"
36android:textSize="18sp"
37  
38android:layout_x="210px"
39android:layout_y="372px"
40>
41</Button>
42</AbsoluteLayout>

*********************************************************************

android 图片透明度处理代码

 
01public static Bitmap setAlpha(Bitmap sourceImg, intnumber) {
02  
03  int[] argb =newint[sourceImg.getWidth() * sourceImg.getHeight()];
04  
05  sourceImg.getPixels(argb, 0, sourceImg.getWidth(),0,0,sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值
06  
07  number = number * 255/100;
08  
09  for(inti = 0; i < argb.length; i++) {
10  
11  argb = (number << 24) | (argb &0x00FFFFFF);// 修改最高2位的值
12  
13  }
14  
15  sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);
16  
17  returnsourceImg;
18  
19

 

 ===================================================================================================================================

====================================================================================================================================

有一阵没更新了,不过项目也已经基本完成,可以写一部分新文章咯。项目虽然已经做完,但是问题还是不少,在3月份会有新的领导过来带领做新版,解决各种手机的适配及优化工作。

 

这回先讲一下ListView异步加载图片的问题,相关的文章很多,不过在这里我将加载、压缩下载、存储到SD卡等功能全部放上来,方便大家使用或者研究。

 

1.      ListView中的SimpleAdapter中的操作

大家在使用ListView显示复杂的页面时,我们都全重写一个SimpleAdapter,重写其中的getView方法来显示具体内容。相关的内容我们下篇文章再说,这里主要看下图片显示的代码。

 

[java]  view plain copy print ?
  1. //图片内容显示   
  2.         if(!topic.getImage_value().equals("")){  
  3.             vh.tl_ll_content_image.setVisibility(View.VISIBLE);  
  4.             //加上标识,要不图片加载会变乱  
  5.             vh.tl_img_content_image.setTag(topic.getTid());  
  6.             vh.tl_img_content_image.setImageResource(R.drawable.default_image_load);  
  7.             //新开异步加载图片  
  8.             LoadingTopicImageAsyncTaskloadingTopicImageAsyncTask = new LoadingTopicImageAsyncTask(vh.tl_img_content_image, topic,ctxContext,true,String.valueOf(topic.getTid()));  
  9.             loadingTopicImageAsyncTask.execute();  
  10.          }  

[java]  view plain copy print ?
  1. //图片内容显示  
  2.         if(!topic.getImage_value().equals("")){  
  3.             vh.tl_ll_content_image.setVisibility(View.VISIBLE);  
  4.             //加上标识,要不图片加载会变乱  
  5.             vh.tl_img_content_image.setTag(topic.getTid());  
  6.             vh.tl_img_content_image.setImageResource(R.drawable.default_image_load);  
  7.             //新开异步加载图片  
  8.             LoadingTopicImageAsyncTaskloadingTopicImageAsyncTask = new LoadingTopicImageAsyncTask(vh.tl_img_content_image, topic,ctxContext,true,String.valueOf(topic.getTid()));  
  9.             loadingTopicImageAsyncTask.execute();  
  10.          }  

·vh. tl_ll_content_image是我们在ListView中要显示相关图片的控件。Topic是我们通过getView取到的当前行的数据对象。Topic.getImage_value()中则是要显示的图片url地址,比如:http://www.huoban168.com/huoban/upload/topic/2012/02/weibo_1329196372_1112447.png

 ·为图片控件加上setTag主要是防止图片混乱。

·LoadingTopicImageAsyncTask是我们新开一个异步,下载或者加载相关的图片的类。基本上主要的操作都在此类中进行。

 

2.      LoadingTopicImageAsyncTask类中的操作

 

[java]  view plain copy print ?
  1. packagehb.hbwb.asynctask;  
  2. importhb.hbwb.model.beans.Topic;  
  3. importhb.hbwb.tools.PicTool;  
  4. importhb.hbwb.var.PublicVariable;  
  5.    
  6. importandroid.app.Activity;  
  7. importandroid.app.Dialog;  
  8. importandroid.graphics.Bitmap;  
  9. importandroid.os.AsyncTask;  
  10. importandroid.view.View;  
  11. importandroid.view.View.OnClickListener;  
  12. importandroid.widget.ImageView;  
  13.    
  14. /** 
  15.  * @name 异步加载图片 
  16.  * @author zhang.yue 
  17.  * @create_date 2011-12-15 
  18.  * @last_edit_author 
  19.  * @last_edit_date 
  20.  * @remark 
  21.  * @edit_remark 
  22.  */  
  23. public classLoadingTopicImageAsyncTask extends  
  24.            AsyncTask<String, Integer,String> {  
  25. private ImageView imageView = null;  
  26. private Topic topic = null;  
  27. private Bitmap bt = null;  
  28. private Activity activity;  
  29. private boolean isClick = true;  
  30. private String tag = "";  
  31.    
  32. /** 
  33.  * 重写构造 
  34.  * 
  35.  * @paramheaderView 
  36.  *            图像控件 
  37.  * @paramtopic 
  38.  * @paramactivity 
  39.  * @paramisClick 
  40.  *            是否可以点击放大 
  41.  */  
  42. public LoadingTopicImageAsyncTask(ImageViewimageView, Topic topic,  
  43.                     Activity activity, booleanisClick, String tag) {  
  44.            super();  
  45.            this.imageView = imageView;  
  46.            this.topic = topic;  
  47.            this.activity = activity;  
  48.            this.isClick = isClick;  
  49.            this.tag = tag;  
  50. }  
  51.    
  52. @Override  
  53. protected String doInBackground(String...params) {  
  54.            // 添加如果是本地缓存的从本地读取...  
  55.            bt =PublicVariable.allTopicImage.get(String.valueOf(topic.getTid()));  
  56.            if (bt == null) {  
  57.                     // 图像获取并保存  
  58.                     if (topic.getImage_value().equals("")){  
  59.                              bt = null;  
  60.                     } else {  
  61.                              bt =PicTool.ReturnBitMap(topic.getImage_value());  
  62.                     }  
  63.            }  
  64.            if (bt!=null) {                                  
  65.                     if(bt.getWidth()>PublicVariable.TOPIC_IMAGE_SHOW-40 ||bt.getHeight()>PublicVariable.TOPIC_IMAGE_SHOW_HEIGHT-40) {  
  66.                              bt =PicTool.ChangeSizeBitMap(bt, PublicVariable.TOPIC_IMAGE_SHOW-40);  
  67.                     }  
  68.            }  
  69.            return null;  
  70. }  
  71.    
  72. @Override  
  73. protected void onPostExecute(String result) {  
  74.            super.onPostExecute(result);  
  75.            if (imageView != null &&topic != null && !tag.equals("")) {  
  76.                     if(imageView.getTag().toString().equals(tag)) {  
  77.                              if (bt != null) {  
  78.                                        if(isClick) {  
  79.                                                 //点击大图效果  
  80.                                                 imageView.setOnClickListener(newOnClickListener() {  
  81.                                                          @Override  
  82.                                                          publicvoid onClick(View v) {  
  83.                                                                    ShowImageClickListener(bt,activity);  
  84.                                                          }  
  85.                                                 });  
  86.                                        }  
  87.                                        imageView.setImageBitmap(bt);  
  88.                                        PublicVariable.allTopicImage.put(  
  89.                                                          String.valueOf(topic.getTid()),bt); // 保存到数组中  
  90.                              }  
  91.                     }  
  92.            }  
  93. }  
  94.    
  95. /** 
  96.  * 图片点击功能事件处理 
  97.  * 
  98.  * @parambt 
  99.  * @paramactivity 
  100.  */  
  101. public static voidShowImageClickListener(Bitmap bt, Activity activity) {  
  102.            Bitmap maxBt =PicTool.ChangeSizeBitMap(bt,  
  103.                              PublicVariable.TOPIC_IMAGE_SHOW);  
  104.            ImageView showImageView = newImageView(activity);  
  105.            showImageView.setImageBitmap(maxBt);  
  106.            //两个嵌套的TabHost中,必须使用activity.getParent()  
  107.            //在首页中使用并无报错,全局使用  
  108.            Dialog d = newDialog(activity.getParent(), hb.hbwb.R.style.no_back_title_dialog);  
  109.            d.setContentView(showImageView);  
  110.            d.setCanceledOnTouchOutside(true);  
  111.            d.show();  
  112. }  
  113.    
  114. }  

[java]  view plain copy print ?
  1. packagehb.hbwb.asynctask;  
  2. importhb.hbwb.model.beans.Topic;  
  3. importhb.hbwb.tools.PicTool;  
  4. importhb.hbwb.var.PublicVariable;  
  5.    
  6. importandroid.app.Activity;  
  7. importandroid.app.Dialog;  
  8. importandroid.graphics.Bitmap;  
  9. importandroid.os.AsyncTask;  
  10. importandroid.view.View;  
  11. importandroid.view.View.OnClickListener;  
  12. importandroid.widget.ImageView;  
  13.    
  14. /** 
  15.  * @name 异步加载图片 
  16.  * @author zhang.yue 
  17.  * @create_date 2011-12-15 
  18.  * @last_edit_author 
  19.  * @last_edit_date 
  20.  * @remark 
  21.  * @edit_remark 
  22.  */  
  23. public classLoadingTopicImageAsyncTask extends  
  24.            AsyncTask<String, Integer,String> {  
  25. private ImageView imageView = null;  
  26. private Topic topic = null;  
  27. private Bitmap bt = null;  
  28. private Activity activity;  
  29. private boolean isClick = true;  
  30. private String tag = "";  
  31.    
  32. /** 
  33.  * 重写构造 
  34.  * 
  35.  * @paramheaderView 
  36.  *            图像控件 
  37.  * @paramtopic 
  38.  * @paramactivity 
  39.  * @paramisClick 
  40.  *            是否可以点击放大 
  41.  */  
  42. public LoadingTopicImageAsyncTask(ImageViewimageView, Topic topic,  
  43.                     Activity activity, booleanisClick, String tag) {  
  44.            super();  
  45.            this.imageView = imageView;  
  46.            this.topic = topic;  
  47.            this.activity = activity;  
  48.            this.isClick = isClick;  
  49.            this.tag = tag;  
  50. }  
  51.    
  52. @Override  
  53. protected String doInBackground(String...params) {  
  54.            // 添加如果是本地缓存的从本地读取...  
  55.            bt =PublicVariable.allTopicImage.get(String.valueOf(topic.getTid()));  
  56.            if (bt == null) {  
  57.                     // 图像获取并保存  
  58.                     if (topic.getImage_value().equals("")){  
  59.                              bt = null;  
  60.                     } else {  
  61.                              bt =PicTool.ReturnBitMap(topic.getImage_value());  
  62.                     }  
  63.            }  
  64.            if (bt!=null) {                                  
  65.                     if(bt.getWidth()>PublicVariable.TOPIC_IMAGE_SHOW-40 ||bt.getHeight()>PublicVariable.TOPIC_IMAGE_SHOW_HEIGHT-40) {  
  66.                              bt =PicTool.ChangeSizeBitMap(bt, PublicVariable.TOPIC_IMAGE_SHOW-40);  
  67.                     }  
  68.            }  
  69.            return null;  
  70. }  
  71.    
  72. @Override  
  73. protected void onPostExecute(String result) {  
  74.            super.onPostExecute(result);  
  75.            if (imageView != null &&topic != null && !tag.equals("")) {  
  76.                     if(imageView.getTag().toString().equals(tag)) {  
  77.                              if (bt != null) {  
  78.                                        if(isClick) {  
  79.                                                 //点击大图效果  
  80.                                                 imageView.setOnClickListener(newOnClickListener() {  
  81.                                                          @Override  
  82.                                                          publicvoid onClick(View v) {  
  83.                                                                    ShowImageClickListener(bt,activity);  
  84.                                                          }  
  85.                                                 });  
  86.                                        }  
  87.                                        imageView.setImageBitmap(bt);  
  88.                                        PublicVariable.allTopicImage.put(  
  89.                                                          String.valueOf(topic.getTid()),bt); // 保存到数组中  
  90.                              }  
  91.                     }  
  92.            }  
  93. }  
  94.    
  95. /** 
  96.  * 图片点击功能事件处理 
  97.  * 
  98.  * @parambt 
  99.  * @paramactivity 
  100.  */  
  101. public static voidShowImageClickListener(Bitmap bt, Activity activity) {  
  102.            Bitmap maxBt =PicTool.ChangeSizeBitMap(bt,  
  103.                              PublicVariable.TOPIC_IMAGE_SHOW);  
  104.            ImageView showImageView = newImageView(activity);  
  105.            showImageView.setImageBitmap(maxBt);  
  106.            //两个嵌套的TabHost中,必须使用activity.getParent()  
  107.            //在首页中使用并无报错,全局使用  
  108.            Dialog d = newDialog(activity.getParent(), hb.hbwb.R.style.no_back_title_dialog);  
  109.            d.setContentView(showImageView);  
  110.            d.setCanceledOnTouchOutside(true);  
  111.            d.show();  
  112. }  
  113.    
  114. }  

·PublicVariable.allTopicImage是我们写的一个HashMap,存储Bitmap的一个集合,如果在程序的运行过程中多次显示同一个图片即可直接从这里面取出Bitmap并显示,可以节省网上加载或者sd卡读取的步骤,键值是topic的tid,一个微博仅显示一张图片。

·如果上述的Bitmap集合中不存在图片的话,调用PicTool类中的ReturnBitMap返回SD卡上缓存的图片。

·如果图片超过我们规定的一个大小,那么调用PicTool类中的ChangeSizeBitMap方法。

·onPostExecute方法是线程执行完成后,我们将Bitmap对象给予Image图片控件并显示出来。在这里我们还添加了点击事件。

 

3.      ReturnBitMap解析

[java]  view plain copy print ?
  1. /** 
  2.  * 返回图片文件用 
  3.  * 
  4.  * @paramurl 
  5.  *            图片url地址 
  6.  *@return 
  7.  */  
  8. public static Bitmap ReturnBitMap(String url) {  
  9.            String imgName =StringTool.GetImageNameForUrl(url);  
  10.            if (imgName.equals("")) {  
  11.                     return null;  
  12.            } else {  
  13.                     FileTool ft = newFileTool();  
  14.                     String path =FileFinals.SDCARDROOT + File.separator + FileFinals.SDCARDIMAGEPATH;  
  15.                     // 图片文件存在并且不是刷新的时候  
  16.                     if (ft.IsFileExist(imgName +FileFinals.IMAGE_SYSTEM_EXT, FileFinals.SDCARDIMAGEPATH)) {  
  17.                              Bitmap bm =ReturnLocalBitMap(path + File.separator + imgName);  
  18.                              if(bm==null){  
  19.                                        returnReturnWebBitMap(url, imgName, path);  
  20.                              }else{  
  21.                                        returnbm;  
  22.                               }  
  23.                     } else {  
  24.                              // 先删除原有的  
  25.                              returnReturnWebBitMap(url, imgName, path);  
  26.                     }  
  27.            }  
  28. }  
  29.           
  30.    
  31. /** 
  32.  * 本地获取图片信息 
  33.  * 
  34.  * @parampath 
  35.  *            图片路径 
  36.  *@return bitmap对象 
  37.  */  
  38. public static Bitmap ReturnLocalBitMap(Stringpath) {  
  39.            Bitmap bitmap =BitmapFactory.decodeFile(path + ".image");  
  40.            return bitmap;  
  41. }  
  42.    
  43. /** 
  44.  * 抓取远程图片 
  45.  * 
  46.  * @paramurl 
  47.  *            图片地址 
  48.  * @paramimgName 
  49.  *            图片名 
  50.  * @parampath 
  51.  *            地址 
  52.  *@return 
  53.  */  
  54. public static Bitmap ReturnWebBitMap(Stringurl, String imgName, String path) {  
  55.    
  56.            Bitmap bitmap = null;  
  57.            try {  
  58.                     // 图片大小判断操作  
  59.                     InputStream size_is =HTMLTool.GetHttpConnection(url).getInputStream();  
  60.                     BitmapFactory.Options op =new BitmapFactory.Options();  
  61.                     op.inJustDecodeBounds =true;  
  62.                     @SuppressWarnings("unused")  
  63.                     Bitmap size_bitmap =BitmapFactory.decodeStream(size_is, null, op);  
  64.                     op.inJustDecodeBounds =true// 仅获取宽高信息,不加载整个图片  
  65.                     boolean isop = false;  
  66.                     int size =PublicVariable.TOPIC_IMAGE_SHOW; // 设定获取的大小不能超过宽高  
  67.                     int bili = 0// 压缩比例  
  68.                     BitmapFactory.Options op_new= new BitmapFactory.Options();  
  69.                     if(op.outWidth>op.outHeight){  
  70.                              if (op.outWidth> size) {  
  71.                                        bili =op.outWidth / size;  
  72.                                        isop =true;  
  73.                              }  
  74.                     }else{  
  75.                              if (op.outHeight> size) {  
  76.                                        bili =op.outHeight / size;  
  77.                                           
  78.                                        isop =true;  
  79.                              }  
  80.                     }  
  81.                      
  82.                     // 根据比例判断  
  83.                     if (bili != 0) {  
  84.                              if (bili < 2) {  
  85.                                        bili = 2;  
  86.                              }else{  
  87.                                  bili = bili*2-2;  
  88.                              }  
  89.                              if(bili%2!=0){  
  90.                                        bili =bili+1;  
  91.                              }  
  92.                              op_new.inSampleSize= bili;  
  93.                     } else {  
  94.                              isop = false;  
  95.                     }  
  96.                     System.out.println(bili);  
  97.                     size_bitmap = null;  
  98.                     size_is.close();  
  99.    
  100.                     // 如果进行过压缩,加载处理后的图片,如果没有直接加载  
  101.                     InputStream is =HTMLTool.GetHttpConnection(url).getInputStream();  
  102.                     if (isop) {  
  103.                              op_new.inPreferredConfig= Bitmap.Config.ARGB_4444;  
  104.                              op_new.inPurgeable= true;  
  105.                              op_new.inInputShareable= true;  
  106.                              bitmap =BitmapFactory.decodeStream(is, null, op_new);  
  107.                     } else {  
  108.                              bitmap =BitmapFactory.decodeStream(is);  
  109.                     }  
  110.                      
  111.    
  112.                     // 将图片写入到内存卡中,做为缓存,将来直接本地读取  
  113.                     WriteBitmapToSdCard(FileFinals.SDCARDIMAGEPATH,path + File.separator + imgName, bitmap);  
  114.    
  115.                     is.close();  
  116.    
  117.            } catch (Exception e) {  
  118.                     return null;  
  119.            }  
  120.            return bitmap;  
  121. }  

[java]  view plain copy print ?
  1. /** 
  2.  * 返回图片文件用 
  3.  * 
  4.  * @paramurl 
  5.  *            图片url地址 
  6.  *@return 
  7.  */  
  8. public static Bitmap ReturnBitMap(String url) {  
  9.            String imgName =StringTool.GetImageNameForUrl(url);  
  10.            if (imgName.equals("")) {  
  11.                     return null;  
  12.            } else {  
  13.                     FileTool ft = newFileTool();  
  14.                     String path =FileFinals.SDCARDROOT + File.separator + FileFinals.SDCARDIMAGEPATH;  
  15.                     // 图片文件存在并且不是刷新的时候  
  16.                     if (ft.IsFileExist(imgName +FileFinals.IMAGE_SYSTEM_EXT, FileFinals.SDCARDIMAGEPATH)) {  
  17.                              Bitmap bm =ReturnLocalBitMap(path + File.separator + imgName);  
  18.                              if(bm==null){  
  19.                                        returnReturnWebBitMap(url, imgName, path);  
  20.                              }else{  
  21.                                        returnbm;  
  22.                               }  
  23.                     } else {  
  24.                              // 先删除原有的  
  25.                              returnReturnWebBitMap(url, imgName, path);  
  26.                     }  
  27.            }  
  28. }  
  29.           
  30.    
  31. /** 
  32.  * 本地获取图片信息 
  33.  * 
  34.  * @parampath 
  35.  *            图片路径 
  36.  *@return bitmap对象 
  37.  */  
  38. public static Bitmap ReturnLocalBitMap(Stringpath) {  
  39.            Bitmap bitmap =BitmapFactory.decodeFile(path + ".image");  
  40.            return bitmap;  
  41. }  
  42.    
  43. /** 
  44.  * 抓取远程图片 
  45.  * 
  46.  * @paramurl 
  47.  *            图片地址 
  48.  * @paramimgName 
  49.  *            图片名 
  50.  * @parampath 
  51.  *            地址 
  52.  *@return 
  53.  */  
  54. public static Bitmap ReturnWebBitMap(Stringurl, String imgName, String path) {  
  55.    
  56.            Bitmap bitmap = null;  
  57.            try {  
  58.                     // 图片大小判断操作  
  59.                     InputStream size_is =HTMLTool.GetHttpConnection(url).getInputStream();  
  60.                     BitmapFactory.Options op =new BitmapFactory.Options();  
  61.                     op.inJustDecodeBounds =true;  
  62.                     @SuppressWarnings("unused")  
  63.                     Bitmap size_bitmap =BitmapFactory.decodeStream(size_is, null, op);  
  64.                     op.inJustDecodeBounds =true// 仅获取宽高信息,不加载整个图片  
  65.                     boolean isop = false;  
  66.                     int size =PublicVariable.TOPIC_IMAGE_SHOW; // 设定获取的大小不能超过宽高  
  67.                     int bili = 0// 压缩比例  
  68.                     BitmapFactory.Options op_new= new BitmapFactory.Options();  
  69.                     if(op.outWidth>op.outHeight){  
  70.                              if (op.outWidth> size) {  
  71.                                        bili =op.outWidth / size;  
  72.                                        isop =true;  
  73.                              }  
  74.                     }else{  
  75.                              if (op.outHeight> size) {  
  76.                                        bili =op.outHeight / size;  
  77.                                           
  78.                                        isop =true;  
  79.                              }  
  80.                     }  
  81.                      
  82.                     // 根据比例判断  
  83.                     if (bili != 0) {  
  84.                              if (bili < 2) {  
  85.                                        bili = 2;  
  86.                              }else{  
  87.                                  bili = bili*2-2;  
  88.                              }  
  89.                              if(bili%2!=0){  
  90.                                        bili =bili+1;  
  91.                              }  
  92.                              op_new.inSampleSize= bili;  
  93.                     } else {  
  94.                              isop = false;  
  95.                     }  
  96.                     System.out.println(bili);  
  97.                     size_bitmap = null;  
  98.                     size_is.close();  
  99.    
  100.                     // 如果进行过压缩,加载处理后的图片,如果没有直接加载  
  101.                     InputStream is =HTMLTool.GetHttpConnection(url).getInputStream();  
  102.                     if (isop) {  
  103.                              op_new.inPreferredConfig= Bitmap.Config.ARGB_4444;  
  104.                              op_new.inPurgeable= true;  
  105.                              op_new.inInputShareable= true;  
  106.                              bitmap =BitmapFactory.decodeStream(is, null, op_new);  
  107.                     } else {  
  108.                              bitmap =BitmapFactory.decodeStream(is);  
  109.                     }  
  110.                      
  111.    
  112.                     // 将图片写入到内存卡中,做为缓存,将来直接本地读取  
  113.                     WriteBitmapToSdCard(FileFinals.SDCARDIMAGEPATH,path + File.separator + imgName, bitmap);  
  114.    
  115.                     is.close();  
  116.    
  117.            } catch (Exception e) {  
  118.                     return null;  
  119.            }  
  120.            return bitmap;  
  121. }  


·StringTool.GetImageNameForUrl是截取文件名,比如:http://www.huoban168.com/huoban/upload/topic/2012/02/weibo_1329196372_1112447.png,返回的是weibo_1329196372_1112447.png这一部分的内容。

·接下来查看当前SD卡的缓存文件路径下有没有这张图,如果有的话,直接调用ReturnLocalBitMap加载图片,如果没有的话,调用ReturnWebBitMap方法去调用网络图片并下载下来。

·后缀名都加了一个".image",目的是防止Android的图片浏览器去加载这些图片。

·ReturnWebBitMap中,先通过HTMLConnection获取图片的InputStream二进制流,然后通过op.inJustDecodeBounds = true; // 这个方法,获取一个只有高度等属性的Bitmap对象,接着根据图片原始大小获取需要大小的压缩比例op_new.inSampleSize = bili;。

·最后取到压缩过的Bitmap对象写入到内存卡或者直接显示均可。至此,图片的下载和保存已完成。

 

4.      ChangeSizeBitMap解析

[java]  view plain copy print ?
  1. /** 
  2.           * 等比例缩放图片 
  3.           * 
  4.           * @param bt 
  5.           *           bitmap图片对象 
  6.           * @param resize 
  7.           *           状态,是否进行缩放 
  8.           * @return bitmap图片对象 
  9.           */  
  10.          publicstatic Bitmap ChangeSizeBitMap(Bitmap bt, int resize) {  
  11.                    intsrc_width = bt.getWidth();  
  12.                    intsrc_height = bt.getHeight();  
  13.                    floatwidth = (float)bt.getWidth();  
  14.                    floatheight = (float)bt.getHeight();  
  15.                    floatbmpWidth = (float) resize / width;   
  16.                    floatbmpHeight = (float) resize / height;  
  17.                    if(width >= height) {  
  18.                             if(width > resize) {  
  19.                                      bmpWidth= (float) resize / height;  
  20.                                      bmpHeight= bmpWidth;  
  21.                             }                            
  22.                    }else{  
  23.                             if(height > resize) {  
  24.                                      bmpHeight= (float) resize / height;  
  25.                                      bmpWidth= bmpHeight;  
  26.                             }  
  27.                    }  
  28.    
  29.                    if(bmpWidth > 1 || bmpHeight > 1) {  
  30.                             returnbt;  
  31.                    }  
  32.                    Matrixmatrix = new Matrix();  
  33.                    matrix.postScale(bmpWidth,bmpHeight);  
  34.                    BitmapresizeBmp = Bitmap.createBitmap(bt, 00, src_width, src_height, matrix, true);  
  35.                    returnresizeBmp;  
  36.          }  

[java]  view plain copy print ?
  1. /** 
  2.           * 等比例缩放图片 
  3.           * 
  4.           * @param bt 
  5.           *           bitmap图片对象 
  6.           * @param resize 
  7.           *           状态,是否进行缩放 
  8.           * @return bitmap图片对象 
  9.           */  
  10.          publicstatic Bitmap ChangeSizeBitMap(Bitmap bt, int resize) {  
  11.                    intsrc_width = bt.getWidth();  
  12.                    intsrc_height = bt.getHeight();  
  13.                    floatwidth = (float)bt.getWidth();  
  14.                    floatheight = (float)bt.getHeight();  
  15.                    floatbmpWidth = (float) resize / width;   
  16.                    floatbmpHeight = (float) resize / height;  
  17.                    if(width >= height) {  
  18.                             if(width > resize) {  
  19.                                      bmpWidth= (float) resize / height;  
  20.                                      bmpHeight= bmpWidth;  
  21.                             }                            
  22.                    }else{  
  23.                             if(height > resize) {  
  24.                                      bmpHeight= (float) resize / height;  
  25.                                      bmpWidth= bmpHeight;  
  26.                             }  
  27.                    }  
  28.    
  29.                    if(bmpWidth > 1 || bmpHeight > 1) {  
  30.                             returnbt;  
  31.                    }  
  32.                    Matrixmatrix = new Matrix();  
  33.                    matrix.postScale(bmpWidth,bmpHeight);  
  34.                    BitmapresizeBmp = Bitmap.createBitmap(bt, 00, src_width, src_height, matrix, true);  
  35.                    returnresizeBmp;  
  36.          }  


这个方法里的东西就很简单了,不过计算的方式可以参考下,和下载图片时候的差不多,有更好的建议欢迎大家来指导一下。

 

 

 

 

============================================================================================================================

=============================================================================================================================

packagecom.android.tutor;  

002importandroid.graphics.Bitmap;  
003importandroid.graphics.Canvas;  
004importandroid.graphics.LinearGradient;  
005importandroid.graphics.Matrix;  
006importandroid.graphics.Paint;  
007importandroid.graphics.PixelFormat;  
008importandroid.graphics.PorterDuffXfermode;  
009importandroid.graphics.Rect;  
010importandroid.graphics.RectF;  
011importandroid.graphics.Bitmap.Config;  
012importandroid.graphics.PorterDuff.Mode;  
013importandroid.graphics.Shader.TileMode;  
014importandroid.graphics.drawable.Drawable;  
015public class ImageUtil {  
016        
017    //放大缩小图片   
018    public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){  
019        int width = bitmap.getWidth();  
020        int height = bitmap.getHeight();  
021        Matrix matrix = newMatrix();  
022        float scaleWidht = ((float)w / width);  
023        float scaleHeight = ((float)h / height);  
024        matrix.postScale(scaleWidht, scaleHeight);  
025        Bitmap newbmp = Bitmap.createBitmap(bitmap, 00, width, height, matrix,true);  
026        returnnewbmp;  
027    }  
028    //将Drawable转化为Bitmap   
029     public static Bitmap drawableToBitmap(Drawable drawable){  
030            int width = drawable.getIntrinsicWidth();  
031            int height = drawable.getIntrinsicHeight();  
032            Bitmap bitmap = Bitmap.createBitmap(width, height,  
033                    drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
034                            : Bitmap.Config.RGB_565);  
035            Canvas canvas = newCanvas(bitmap);  
036            drawable.setBounds(0,0,width,height);  
037            drawable.draw(canvas);  
038            returnbitmap;  
039                
040        }  
041         
042     //获得圆角图片的方法   
043    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){  
044            
045        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap  
046                .getHeight(), Config.ARGB_8888);  
047        Canvas canvas = newCanvas(output);  
048     
049        final int color =0xff424242;  
050        final Paint paint = newPaint();  
051        final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());  
052        final RectF rectF = newRectF(rect);  
053     
054        paint.setAntiAlias(true);  
055        canvas.drawARGB(000,0);  
056        paint.setColor(color);  
057        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
058     
059        paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));  
060        canvas.drawBitmap(bitmap, rect, rect, paint);  
061     
062        returnoutput;  
063    }  
064    //获得带倒影的图片方法   
065    public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){  
066        final int reflectionGap =4;  
067        int width = bitmap.getWidth();  
068        int height = bitmap.getHeight();  
069            
070        Matrix matrix = newMatrix();  
071        matrix.preScale(1, -1);  
072            
073        Bitmap reflectionImage = Bitmap.createBitmap(bitmap,   
074                0, height/2, width, height/2, matrix,false);  
075            
076        Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);  
077            
078        Canvas canvas = newCanvas(bitmapWithReflection);  
079        canvas.drawBitmap(bitmap, 00,null);  
080        Paint deafalutPaint = newPaint();  
081        canvas.drawRect(0, height,width,height + reflectionGap,  
082                deafalutPaint);  
083            
084        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap,null);  
085            
086        Paint paint = newPaint();  
087        LinearGradient shader = newLinearGradient(0,  
088                bitmap.getHeight(), 0, bitmapWithReflection.getHeight()  
089                + reflectionGap, 0x70ffffff0x00ffffff, TileMode.CLAMP);  
090        paint.setShader(shader);  
091        // Set the Transfer mode to be porter duff and destination in   
092        paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN));  
093        // Draw a rectangle using the paint with our linear gradient   
094        canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()  
095                + reflectionGap, paint);  
096     
097        returnbitmapWithReflection;  
098    }  
099        
100}

 







原文地址:http://blog.csdn.net/linghu_java/article/details/7664497

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值