Ваши обработчики нажатий кнопок создают новый клиент MQTT для каждого щелчка, и каждый клиент использует один и тот же идентификатор клиента. В каждом конкретном случае может быть только один клиент, использующий данный идентификатор клиента, поэтому повторное использование этого идентификатора клиента отключит предыдущий клиент MQTT.
Это разъединение означает, что никогда не бывает окна, в течение которого клиент подписывается на тему, а другой (или тот же) клиент публикует эту тему. Это можно исправить, подключившись один раз в конструкторе Form и используя то же соединение MQTT в вашем приложении. Это будет означать удаление следующих двух строк из обоих обработчиков щелчков:
client = new MqttClient("broker.hivemq.com");
byte code = client.Connect("lenovofullondude");
Можно ли создать два разных приложения. И второе приложение получит сообщение по этой теме (поскольку он подписчик)
blockquote>Да. Но обоим приложениям понадобятся разные идентификаторы клиентов во время соединения MQTT.
Вы можете пропустить сложные манипуляции с Canvas и сделать это полностью с помощью Drawables, используя LayerDrawable
. У вас есть один из двух вариантов: вы можете либо определить его в XML , а затем просто установить изображение, либо вы можете настроить LayerDrawable
динамически в коде.
Решение №1 (через XML):
Создайте новый XML-файл Drawable, назовем его 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));
Решение № 2 (динамический):
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);
(Я не тестировал этот код, поэтому может быть ошибка, но эта общая схема должна работать.)
это - мое решение:
public Bitmap Blend(Bitmap topImage1, Bitmap bottomImage1, PorterDuff.Mode Type) {
Bitmap workingBitmap = Bitmap.createBitmap(topImage1);
Bitmap topImage = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);
Bitmap workingBitmap2 = Bitmap.createBitmap(bottomImage1);
Bitmap bottomImage = workingBitmap2.copy(Bitmap.Config.ARGB_8888, true);
Rect dest = new Rect(0, 0, bottomImage.getWidth(), bottomImage.getHeight());
new BitmapFactory.Options().inPreferredConfig = Bitmap.Config.ARGB_8888;
bottomImage.setHasAlpha(true);
Canvas canvas = new Canvas(bottomImage);
Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Type));
paint.setFilterBitmap(true);
canvas.drawBitmap(topImage, null, dest, paint);
return bottomImage;
}
использование:
imageView.setImageBitmap(Blend(topBitmap, bottomBitmap, PorterDuff.Mode.SCREEN));
или
imageView.setImageBitmap(Blend(topBitmap, bottomBitmap, PorterDuff.Mode.OVERLAY));
и результаты: