在android中覆盖两个图像来设置imageview

我试图在我的应用程序中叠加两个图像,但他们似乎崩溃在我的canvas.setBitmap()行。 我究竟做错了什么?

 private void test() { Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.t); Bitmap mBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.tt); Bitmap bmOverlay = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap.getConfig()); Canvas canvas = new Canvas(); canvas.setBitmap(bmOverlay); canvas.drawBitmap(mBitmap, new Matrix(), null); canvas.drawBitmap(mBitmap2, new Matrix(), null); testimage.setImageBitmap(bmOverlay); } 

您可以跳过复杂的Canvas操作,并使用LayerDrawable完全使用Drawable执行此操作。 你有两种select:你可以用XML定义它,然后简单地设置图像,或者你可以在代码中dynamicconfiguration一个LayerDrawable

解决scheme#1(通过XML):

创build一个新的Drawable XML文件,我们称它为layer.xml

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/t" /> <item android:drawable="@drawable/tt" /> </layer-list> 

现在使用Drawable设置图像:

 testimage.setImageDrawable(getResources().getDrawable(R.layout.layer)); 

解决scheme2(dynamic):

 Resources r = getResources(); Drawable[] layers = new Drawable[2]; layers[0] = r.getDrawable(R.drawable.t); layers[1] = r.getDrawable(R.drawable.tt); LayerDrawable layerDrawable = new LayerDrawable(layers); testimage.setImageDrawable(layerDrawable); 

(我没有testing过这个代码,所以可能会有一个错误,但是这个大纲应该可以工作。)

好吧,只要你知道那里有一个程序叫做DroidDraw。 它可以帮助您绘制对象,并尝试一个在另一个之上。 我尝试了你的解决scheme,但我有较小的图像下的animation,所以没有奏效。 但后来我试图把一个图像放在一个相对的布局中,然后在这个布局之上,我画了另外一个图像,这个图像被覆盖,一切都很好。 所以RelativeLayout,DroidDraw和你很好去:)简单,没有任何一种jiggery嘲讽:)这里是一个雅代码:

该徽标将在shazam背景图片上。

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@+id/widget30" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <ImageView android:id="@+id/widget39" android:layout_width="219px" android:layout_height="225px" android:src="@drawable/shazam_bkgd" android:layout_centerVertical="true" android:layout_centerHorizontal="true" > </ImageView> <ImageView android:id="@+id/widget37" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/shazam_logo" android:layout_centerVertical="true" android:layout_centerHorizontal="true" > </ImageView> </RelativeLayout> 

它的答案有点晚,但它涵盖了使用毕加索合并图片来自url

MergeImageView

 import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.os.AsyncTask; import android.os.Build; import android.util.AttributeSet; import android.util.SparseArray; import android.widget.ImageView; import com.squareup.picasso.Picasso; import java.io.IOException; import java.util.List; public class MergeImageView extends ImageView { private SparseArray<Bitmap> bitmaps = new SparseArray<>(); private Picasso picasso; private final int DEFAULT_IMAGE_SIZE = 50; private int MIN_IMAGE_SIZE = DEFAULT_IMAGE_SIZE; private int MAX_WIDTH = DEFAULT_IMAGE_SIZE * 2, MAX_HEIGHT = DEFAULT_IMAGE_SIZE * 2; private String picassoRequestTag = null; public MergeImageView(Context context) { super(context); } public MergeImageView(Context context, AttributeSet attrs) { super(context, attrs); } public MergeImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public MergeImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override public boolean isInEditMode() { return true; } public void clearResources() { if (bitmaps != null) { for (int i = 0; i < bitmaps.size(); i++) bitmaps.get(i).recycle(); bitmaps.clear(); } // cancel picasso requests if (picasso != null && AppUtils.ifNotNullEmpty(picassoRequestTag)) picasso.cancelTag(picassoRequestTag); picasso = null; bitmaps = null; } public void createMergedBitmap(Context context, List<String> imageUrls, String picassoTag) { picasso = Picasso.with(context); int count = imageUrls.size(); picassoRequestTag = picassoTag; boolean isEven = count % 2 == 0; // if url size are not even make MIN_IMAGE_SIZE even MIN_IMAGE_SIZE = DEFAULT_IMAGE_SIZE + (isEven ? count / 2 : (count / 2) + 1); // set MAX_WIDTH and MAX_HEIGHT to twice of MIN_IMAGE_SIZE MAX_WIDTH = MAX_HEIGHT = MIN_IMAGE_SIZE * 2; // in case of odd urls increase MAX_HEIGHT if (!isEven) MAX_HEIGHT = MAX_WIDTH + MIN_IMAGE_SIZE; // create default bitmap Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_wallpaper), MIN_IMAGE_SIZE, MIN_IMAGE_SIZE, false); // change default height (wrap_content) to MAX_HEIGHT int height = Math.round(AppUtils.convertDpToPixel(MAX_HEIGHT, context)); setMinimumHeight(height * 2); // start AsyncTask for (int index = 0; index < count; index++) { // put default bitmap as a place holder bitmaps.put(index, bitmap); new PicassoLoadImage(index, imageUrls.get(index)).execute(); // if you want parallel execution use // new PicassoLoadImage(index, imageUrls.get(index)).(AsyncTask.THREAD_POOL_EXECUTOR); } } private class PicassoLoadImage extends AsyncTask<String, Void, Bitmap> { private int index = 0; private String url; PicassoLoadImage(int index, String url) { this.index = index; this.url = url; } @Override protected Bitmap doInBackground(String... params) { try { // synchronous picasso call return picasso.load(url).resize(MIN_IMAGE_SIZE, MIN_IMAGE_SIZE).tag(picassoRequestTag).get(); } catch (IOException e) { } return null; } @Override protected void onPostExecute(Bitmap output) { super.onPostExecute(output); if (output != null) bitmaps.put(index, output); // create canvas Bitmap.Config conf = Bitmap.Config.RGB_565; Bitmap canvasBitmap = Bitmap.createBitmap(MAX_WIDTH, MAX_HEIGHT, conf); Canvas canvas = new Canvas(canvasBitmap); canvas.drawColor(Color.WHITE); // if height and width are equal we have even images boolean isEven = MAX_HEIGHT == MAX_WIDTH; int imageSize = bitmaps.size(); int count = imageSize; // we have odd images if (!isEven) count = imageSize - 1; for (int i = 0; i < count; i++) { Bitmap bitmap = bitmaps.get(i); canvas.drawBitmap(bitmap, bitmap.getWidth() * (i % 2), bitmap.getHeight() * (i / 2), null); } // if images are not even set last image width to MAX_WIDTH if (!isEven) { Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmaps.get(count), MAX_WIDTH, MIN_IMAGE_SIZE, false); canvas.drawBitmap(scaledBitmap, scaledBitmap.getWidth() * (count % 2), scaledBitmap.getHeight() * (count / 2), null); } // set bitmap setImageBitmap(canvasBitmap); } } } 

XML

 <com.example.MergeImageView android:id="@+id/iv_thumb" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

 List<String> urls = new ArrayList<>(); String picassoTag = null; // add your urls ((MergeImageView)findViewById(R.id.iv_thumb)). createMergedBitmap(MainActivity.this, urls,picassoTag); 

您可以使用下面的代码来解决问题或在这里下载演示

创build两个函数来处理每个函数。

首先,绘制canvas,并将图像从点(0,0)

点击button

 public void buttonMerge(View view) { Bitmap bigImage = BitmapFactory.decodeResource(getResources(), R.drawable.img1); Bitmap smallImage = BitmapFactory.decodeResource(getResources(), R.drawable.img2); Bitmap mergedImages = createSingleImageFromMultipleImages(bigImage, smallImage); img.setImageBitmap(mergedImages); } 

函数来创build一个覆盖。

 private Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage){ Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig()); Canvas canvas = new Canvas(result); canvas.drawBitmap(firstImage, 0f, 0f, null); canvas.drawBitmap(secondImage, 10, 10, null); return result; }public void buttonClick(View view){ 

}

阅读更多