Xamarin.Andoid:使用CanvasView合并ImageView

时间:2018-05-02 09:01:11

标签: android canvas merge xamarin.android android-imageview

我正在使用this xamarin sample中的 FingerPaintCanvasView

我正在使用 2层。第一层是我想要绘制的 ImageView 。第二层是要绘制的 PaintCanvasView

  <RelativeLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent">
    <ImageView
      android:id="@+id/markImageImageView"
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"/>
    <fingerpaint.FingerPaintCanvasView
      android:id="@+id/canvasMarkMeta"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
  </RelativeLayout>

画布具有透明背景,两个视图的布局参数都是以编程方式设置的。这样标记工作正常。

enter image description here

现在的问题是,如何将这个imageview与标记画布合并,尽可能少地降低singel文件的质量(文件系统中的位图或imageFile)。

让我解释为什么我提到质量损失: 例如,背景中的图像与设备相机的大小为1920x1080。显示屏只有1280x800像素。由于我无法在显示器中显示图像,因此我需要显示缩小版本,并且在此缩小版本上进行标记。

修改

@Joe LV:

这是您的演示,我的设备上未部署任何更改:

联想Yoga 3,Android 6.0.1 enter image description here

华为Honor 8,Android 7.0 enter image description here

我很快就会尝试使用Android 8模拟器。

Pixel 2XL,Android 8.1 enter image description here

因此,此方法不适用于API&lt; = 24 :-( (API 25和26未经测试)

markImageImageView只保存从设备存储加载的图像(可以是任何图像) canvasMarkMeta是来自链接模板的FingerPaintCanvas,它保存绘制的线条。

1 个答案:

答案 0 :(得分:2)

下面是代码,我在其中添加了注释:

> range(getRatings(r))

我在github上提供了demo

更新

public class MainActivity : Activity { private Rect mSrcRect, mDestRect; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); //your background picture ---markImageImageView Bitmap background = BitmapFactory.DecodeResource(Resources, Resource.Drawable.pause); //your foreground picture ---FingerPaintCanvasView Bitmap foreground = BitmapFactory.DecodeResource(Resources, Resource.Drawable.play); Paint p = new Paint(); p.SetXfermode(new PorterDuffXfermode(PorterDuff.Mode.SrcOver)); //use background to create a canvas Bitmap workingBitmap = Bitmap.CreateBitmap(background); Bitmap mutableBitmap = workingBitmap.Copy(Bitmap.Config.Argb8888, true); Canvas c = new Canvas(mutableBitmap); int mBWith = background.Width; int mBHeight = background.Height; int mFWith = foreground.Width; int mFHeight = foreground.Height; mSrcRect = new Rect(0, 0, mBWith, mBHeight); mDestRect = new Rect(0, 0, mFWith, mFHeight); //draw foreground on the backaground, then they will be single bitmap c.DrawBitmap(foreground, mSrcRect, mDestRect, p); ImageView imageView = FindViewById<ImageView>(Resource.Id.iv); imageView.SetImageBitmap(mutableBitmap); } } 更改为Bitmap.Config.Argb4444