今天与大家分享在Xamarin.Forms中的如何实现选择本地图片并进行剪裁。实现思路:Xamarin.Forms中定义相应接口,Xamarin.Android中实现该接口,也就是说直接使用Android原生平台上的方式。具体看代码:

步骤1、在Forms中定义接口,参数finish是剪裁完成后的操作处理,sourceType是从相机还是图库中获取图片

 public interface ICutImageHandle{void StartCutImage(Action<string> finish, int sourceType);}

步骤2、Xamarin.Android工程中实现接口。

[assembly: Dependency(typeof(CutImageHandle_Droid))]
namespace Xamarin.Forms.Study.Droid
{public class CutImageHandle_Droid:ICutImageHandle{private static Context Context{get { return Forms.Context ?? Android.App.Application.Context; }}public void StartCutImage(Action<string> finish,int sourceType){Intent _intent = new Intent(Context, typeof(MediaPickerActivity));_intent.PutExtra("sourceType", sourceType); //0-相机  1-图库Context.StartActivity(_intent);MediaPickerActivity.ImageCut += (str) =>{if (finish != null){finish(str);}};  }}
}

MediaPickerActivity类:

[Activity]public class MediaPickerActivity : Activity{public static Action<string> ImageCut;Java.IO.File sdcardTempFile;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);sdcardTempFile = new Java.IO.File("/mnt/sdcard/", "tmp_pic_" + SystemClock.CurrentThreadTimeMillis() + ".jpg");//0-相机  1-图库if (Intent.GetIntExtra("sourceType",1) == 0){CutImageByCamera();}else if (Intent.GetIntExtra("sourceType",1) ==1){CutImageByImgStore();}}protected override void OnActivityResult(int requestCode, Result resultCode, Intent data){// base.OnActivityResult(requestCode, resultCode, data);if (resultCode == Result.Ok){if (requestCode == 3) //剪裁{if (ImageCut != null){ImageCut(sdcardTempFile.AbsolutePath);}}}Finish();}private void CutImageByImgStore(){Intent _intentCut = new Intent("android.intent.action.PICK");_intentCut.SetDataAndType(MediaStore.Images.Media.InternalContentUri, "image/*");_intentCut.PutExtra("output", Android.Net.Uri.FromFile(sdcardTempFile));_intentCut.PutExtra("crop", "true");_intentCut.PutExtra("aspectX", 1);// 裁剪框比例_intentCut.PutExtra("aspectY", 1);_intentCut.PutExtra("outputX", 180);// 输出图片大小_intentCut.PutExtra("outputY", 180);this.StartActivityForResult(_intentCut, 3);}private void CutImageByCamera(){Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");intent.PutExtra("output", Android.Net.Uri.FromFile(sdcardTempFile));intent.PutExtra("crop", "true");intent.PutExtra("aspectX", 1);// 裁剪框比例intent.PutExtra("aspectY", 1);intent.PutExtra("outputX", 180);// 输出图片大小intent.PutExtra("outputY", 180);StartActivityForResult(intent, 3);}}

步骤3:调用接口,实现功能

 Button _btn2 = new Button() { Text = "cut image" };_btn2.Clicked += (sender, arg) =>{DependencyService.Get<ICutImageHandle>().StartCutImage((_str) =>{_img.Source = _str;},1);};

效果如图:

通过这个列子,大家应该了解了Xamarin中如何在原生平台上实现接口,原生平台上可以实现的东西,大部分都可以通过这样的方式去实现。但是这种方式还是比较麻烦的,因为各个平台需要单独实现。不过好在以后Xamarin更加成熟了,我想应该会变得更加简单些。以上是我自己写的代码,比较粗糙。大家有有什么问题可以加QQ群一起学习讨论。QQ群365516544

Xamarin.Forms中实现选择本地图片,并进行剪裁。(Android端)相关推荐

  1. Xamarin.Forms中为WebView指定数据来源Source

    Xamarin.Forms中为WebView指定数据来源Source 网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebView ...

  2. Xamarin.Forms中使用LiteDB分页

    Xamarin.Forms中使用LiteDB分页 在移动应用的开发中,为力提高用户体验,一般都会在本地设计一套数据缓存.这里我使用的是LiteDB来缓存数据. LiteDB是.Net平台的一个开源的N ...

  3. Xamarin XAML语言教程Xamarin.Forms中构建进度条

    Xamarin XAML语言教程Xamarin.Forms中构建进度条 ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度条总是水平放置的.本节将讲解如何使用进度条. 注意:进度条在 ...

  4. Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

    Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的: ...

  5. Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)

    Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一) 在Xamarin.Forms中,提供了两个控件用来指示程序的状态和进度.他们分别为活动指示器和进度条.其中,活动指示器 ...

  6. Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装

    Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装 在移动应用开发中,经常需要判断一个app是否安装,iOS中有什么方式可以判断app是否安装呢? 这里介绍通过Url Sch ...

  7. 解决微信小程序开发中wxss中不能用本地图片

    微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...

  8. js 选择本地图片并显示

    选择本地图片并将所选图片显示 <html> <body> <img id="image" src=""/> <br/& ...

  9. 关于van-card中thumb引入本地图片而无法正常显示的解决方法

    关于van-card中thumb引入本地图片而无法正常显示的解决方法 前言 解决办法 总结 前言 最近在弄一个微信公众号,是H5前端,用到的是vant组件. 当然Vant的官方文档以及例子都有,但是很 ...

最新文章

  1. 云计算将成为金融服务业的主流技术
  2. 关于flume配置加载(二)
  3. Naigos PNP图无法加载最新数据
  4. 将数据导入DB2带自增字段的表
  5. java8-接口新特性
  6. python爬虫多线程是什么意思_python爬虫中多线程的使用详解
  7. IETF访谈: HTTP/3全球份额持续增长,QUIC前景一片光明
  8. css --- 行内框和内容区
  9. html自动图片尺寸,关于html:CSS背景图像适合宽度,高度应按比例自动缩放
  10. 冒泡排序--Java
  11. python中的reduce函数用法
  12. c语言message函数应用,调用input_message的参数太少在主函数中 是神马意思 大神们帮帮我...
  13. 插件properties_PageHelper分页插件的原理是什么
  14. solr导入mysql时间类型_docker 安装solr 导入mysql时报错
  15. mib browser使用
  16. 国产手机再次发力,是否可以阻击三星苹果
  17. 湖南大学头歌期中模拟试卷
  18. 自定义icon,在iconfont.css中引入自定义图标
  19. 如何在CSDN写笔记_写笔记前的插件安装
  20. GD32F303课程【2】GPIO操作LED和按键

热门文章

  1. 【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程
  2. Java利用键盘接收来做简单的题目
  3. winlogon.exe应用程序错误怎么办
  4. 电子计算机月初美妙的交响,江苏版二年级下学期语文期中测试试卷(8页)-原创力文档...
  5. 【Python】近似熵,样本熵,模糊熵计算高效版
  6. ASP社群直播/聊天室/分销/系统源码
  7. 快速排序 - 一个萝卜一个坑
  8. 重构(一)-重构的意义与原则
  9. PyTorch 实现批训练和 Optimizer 优化器
  10. UltraEdit 脚本命令