1.異步加載佈局上的圖片顯示
使用加載方式Glide
implementation('com.github.bumptech.glide:glide:4.7.1') {
exclude group: "com.android.support"
}
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
2.測試佈局activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:text="可以點擊"
android:textColor="@color/colorPrimary"
android:textSize="18sp" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/ll_top"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@color/colorPrimary">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="@string/app_name"
android:textColor="@color/colorAccent" />
</LinearLayout>
<ImageView
android:id="@+id/iv_show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
</RelativeLayout>
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="vertical"
android:background="@color/colorAccent">
<ImageView
android:id="@+id/iv_show2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
3.傳異步加載圖片
3.1計算view的大小
public void measureSize(Activity activity, String url) {
//將佈局轉化成view對象
View viewBitmap = LayoutInflater.from(activity).inflate(R.layout.activity_second, null);
View viewById = viewBitmap.findViewById(R.id.rl);
WindowManager manager = activity.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;
//然後View和其內部的子View都具有了實際大小,也就是完成了佈局,相當與添加到了界面上。接着就可以創建位圖並在上面繪製了:
layoutView(viewById, width, height, url, activity);
}
3.2填充佈局內容
public void layoutView(final View viewBitmap, int width, int height, String url, Activity activity) {
// 整個View的大小 參數是左上角 和右下角的座標
viewBitmap.layout(0, 0, width, height);
int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST);
viewBitmap.measure(measuredWidth, measuredHeight);
viewBitmap.layout(0, 0, viewBitmap.getMeasuredWidth(), viewBitmap.getMeasuredHeight());
final ImageView imageView = viewBitmap.findViewById(R.id.iv_show);
//注意加載網絡圖片時一定要用SimpleTarget回調
Glide.with(activity).asBitmap().load(url).into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
Bitmap bitmap = viewSaveToImage(viewBitmap);
ivShow2.setImageBitmap(bitmap);
llBottom.setBackgroundColor(Color.parseColor("#dddddd"));
}
});
}
3.3把view轉成圖片
private Bitmap viewSaveToImage(View view) {
view.setDrawingCacheEnabled(true);
view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
view.setDrawingCacheBackgroundColor(Color.WHITE);
// 把一個View轉換成圖片
Bitmap cachebmp = viewConversionBitmap(view);
// if (mBitmapDoneListener != null){
// mBitmapDoneListener.bitmapDone(cachebmp);
// }
view.destroyDrawingCache();
return cachebmp;
}
3.4view轉bitmap
public Bitmap viewConversionBitmap(View v) {
int w = v.getWidth();
int h = v.getHeight();
if (w <=0 || h<=0) {
Toast.makeText(this, "view's width or height are <= 0", Toast.LENGTH_SHORT).show();
return null;
}
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
c.drawColor(Color.WHITE);
/** 如果不設置canvas畫布爲白色,則生成透明 */
v.layout(0, 0, w, h);
v.draw(c);
return bmp;
}
3.5 把上面獲得的bitmap傳進來就可以得到圓角的bitmap了
public void bitmapInBitmap(Bitmap bitmap, ImageView imageView) {
Bitmap tempBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(tempBitmap);
//圖像上畫矩形
Paint paint = new Paint();
paint.setColor(Color.TRANSPARENT);
paint.setStyle(Paint.Style.STROKE);//不填充
paint.setStrokeWidth(10); //線的寬度
canvas.drawRect(10, 20, 100, 100, paint);
imageView.setImageBitmap(tempBitmap);
//畫中畫
Paint photoPaint = new Paint(); // 建立畫筆
photoPaint.setDither(true); // 獲取跟清晰的圖像採樣
photoPaint.setFilterBitmap(true);// 過濾一些
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());// 創建一個指定的新矩形的座標
Rect dst = new Rect(0, 0, 300, 350);// 創建一個指定的新矩形的座標
canvas.drawBitmap(tempBitmap, src, dst, photoPaint);// 將photo 縮放或則擴大到
imageView.setImageBitmap(getRoundedCornerBitmap(tempBitmap));
}
3.6 生成圓角圖片
public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
try {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight());
final RectF rectF = new RectF(new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight()));
//設置圓角大小
final float roundPx = 30;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.BLACK);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
final Rect src = new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight());
canvas.drawBitmap(bitmap, src, rect, paint);
return output;
} catch (Exception e) {
return bitmap;
}
}
4.總結頁面顯示SecondActivity
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* Created by GetOn on 2019/3/11.
*/
public class SecondActivity extends AppCompatActivity {
@BindView(R.id.btn)
Button btn;
@BindView(R.id.ll_bottom)
LinearLayout llBottom;
@BindView(R.id.ll_top)
LinearLayout llTop;
@BindView(R.id.iv_show)
ImageView ivShow;
@BindView(R.id.iv_show2)
ImageView ivShow2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ButterKnife.bind(this);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
measureSize(SecondActivity.this, "http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg");
}
});
}
/**
* 計算view的大小
*/
public void measureSize(Activity activity, String url) {
//將佈局轉化成view對象
View viewBitmap = LayoutInflater.from(activity).inflate(R.layout.activity_second, null);
View viewById = viewBitmap.findViewById(R.id.rl);
WindowManager manager = activity.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;
//然後View和其內部的子View都具有了實際大小,也就是完成了佈局,相當與添加到了界面上。接着就可以創建位圖並在上面繪製了:
layoutView(viewById, width, height, url, activity);
}
/**
* 填充佈局內容
*/
public void layoutView(final View viewBitmap, int width, int height, String url, Activity activity) {
// 整個View的大小 參數是左上角 和右下角的座標
viewBitmap.layout(0, 0, width, height);
int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST);
viewBitmap.measure(measuredWidth, measuredHeight);
viewBitmap.layout(0, 0, viewBitmap.getMeasuredWidth(), viewBitmap.getMeasuredHeight());
final ImageView imageView = viewBitmap.findViewById(R.id.iv_show);
//注意加載網絡圖片時一定要用SimpleTarget回調
Glide.with(activity).asBitmap().load(url).into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
Bitmap bitmap = viewSaveToImage(viewBitmap);
ivShow2.setImageBitmap(bitmap);
llBottom.setBackgroundColor(Color.parseColor("#dddddd"));
}
});
}
/**
* 把view轉成圖片
*
* @param view
*/
private Bitmap viewSaveToImage(View view) {
view.setDrawingCacheEnabled(true);
view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
view.setDrawingCacheBackgroundColor(Color.WHITE);
// 把一個View轉換成圖片
Bitmap cachebmp = viewConversionBitmap(view);
// if (mBitmapDoneListener != null){
// mBitmapDoneListener.bitmapDone(cachebmp);
// }
view.destroyDrawingCache();
return cachebmp;
}
/**
* view轉bitmap
*/
public Bitmap viewConversionBitmap(View v) {
int w = v.getWidth();
int h = v.getHeight();
if (w <=0 || h<=0) {
Toast.makeText(this, "view's width or height are <= 0", Toast.LENGTH_SHORT).show();
return null;
}
Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);
c.drawColor(Color.WHITE);
/** 如果不設置canvas畫布爲白色,則生成透明 */
v.layout(0, 0, w, h);
v.draw(c);
return bmp;
}
/**
* 把上面獲得的bitmap傳進來就可以得到圓角的bitmap了
*/
public void bitmapInBitmap(Bitmap bitmap, ImageView imageView) {
Bitmap tempBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(tempBitmap);
//圖像上畫矩形
Paint paint = new Paint();
paint.setColor(Color.TRANSPARENT);
paint.setStyle(Paint.Style.STROKE);//不填充
paint.setStrokeWidth(10); //線的寬度
canvas.drawRect(10, 20, 100, 100, paint);
imageView.setImageBitmap(tempBitmap);
//畫中畫
Paint photoPaint = new Paint(); // 建立畫筆
photoPaint.setDither(true); // 獲取跟清晰的圖像採樣
photoPaint.setFilterBitmap(true);// 過濾一些
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());// 創建一個指定的新矩形的座標
Rect dst = new Rect(0, 0, 300, 350);// 創建一個指定的新矩形的座標
canvas.drawBitmap(tempBitmap, src, dst, photoPaint);// 將photo 縮放或則擴大到
imageView.setImageBitmap(getRoundedCornerBitmap(tempBitmap));
}
/**
* 生成圓角圖片
*/
public Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
try {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight());
final RectF rectF = new RectF(new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight()));
//設置圓角大小
final float roundPx = 30;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.BLACK);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
final Rect src = new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight());
canvas.drawBitmap(bitmap, src, rect, paint);
return output;
} catch (Exception e) {
return bitmap;
}
}
}
//備份使用