Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Superponer dos imágenes en android para establecer una vista de imagen

Estoy tratando de superponer dos imágenes en mi aplicación, pero parece que se bloquean en mi línea canvas.setBitmap() . ¿Qué estoy haciendo mal?

 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); } 

  • ¿Cómo alinear ImageView a la parte inferior, llenar su ancho y altura, y mantener su relación de aspecto?
  • Matriz de imágenes en android
  • Colocar la imagen en las coordenadas de Android
  • Android: ¿Cómo enviar una imagen como adjunto de correo electrónico desde la aplicación?
  • Cómo implementar efectos de distorsión de imagen en Android
  • Mapa de bits de Android: convierte píxeles transparentes a un color
  • Tirar a la animación del zumbido
  • Dibuja parte de la imagen a la pantalla (sin cargar todo a la memoria)
  • 4 Solutions collect form web for “Superponer dos imágenes en android para establecer una vista de imagen”

    Puede omitir la compleja manipulación de Canvas y hacerlo completamente con Drawables, usando LayerDrawable . Usted tiene una de dos opciones: Puede definirlo en XML , simplemente configurar la imagen, o puede configurar un LayerDrawable dinámicamente en el código.

    Solución # 1 (a través de XML):

    Cree un nuevo archivo XML Drawable, llamémosle 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> 

    Ahora configura la imagen usando ese Drawable:

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

    Solución # 2 (dinámica):

     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); 

    (No he probado este código para que pueda haber un error, pero este esquema general debería funcionar.)

    Ok sólo para que sepas que hay un programa por ahí que se llama DroidDraw. Puede ayudarte a dibujar objetos y probar uno encima del otro. Intenté su solución pero tenía animación debajo de la imagen más pequeña así que no trabajó. Pero luego traté de colocar una imagen en un diseño relativo que se supone que debe estar debajo de primero y luego en la parte superior de la que dibujé la otra imagen que se supone que se superponen y todo funcionó muy bien. Así que RelativeLayout, DroidDraw y que son buenos para ir 🙂 Simple, no cualquier tipo de pockery jiggery 🙂 y aquí hay un poco de código para ya:

    El logotipo va a estar en la parte superior de la imagen de fondo 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> 

    Su respuesta un poco tarde, pero cubre la fusión de imágenes de urls con Picasso

    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" /> 

    Ejemplo

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

    Puede utilizar el siguiente código para solucionar el problema o descargar la demo aquí

    Cree dos funciones para manejar cada una.

    En primer lugar, se dibuja el lienzo y las imágenes se dibujan una encima de la otra desde el punto (0,0)

    En el botón de clic

     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); } 

    Función para crear una superposición.

     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){ 

    }

    Lee mas

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.