Android MediaStore Crop 功能,如何让选择箭头始终可见?
Posted
技术标签:
【中文标题】Android MediaStore Crop 功能,如何让选择箭头始终可见?【英文标题】:Android MediaStore Crop function, how to make selection arrows always visible? 【发布时间】:2012-04-04 09:41:10 【问题描述】:我正在开发一个图片选择/裁剪程序并使用下面的代码:
http://www.androidworks.com/crop_large_photos_with_android/comment-page-1#comment-969
据我所知,我们设置属性时将附加内容添加到我们的意图中,如下面的代码。
为了改变选择区域,我们需要触摸边框,然后箭头变得可见,但我想做的是让它们始终可见,因为这样很难让用户理解。 Instagram 的 Android 应用程序就是这样做的,所以我想有办法做到这一点。
谢谢。
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", scale);
intent.putExtra("return-data", return_data);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());
编辑/解决方案: 感谢@Renard,我找到了这样的解决方案:
我使用了这个图库源代码: http://gitorious.org/0xdroid/packages_apps_gallery3d/trees/3c02f2877dc2f8f0b5c01d03fa2b487c040e4000
我也尝试了一些其他画廊资源代码,但这个是最容易维护的。
如果签入 Highlightview.java 类的 draw() 函数,你只需要删除下面的内容:
if (mMode == ModifyMode.Grow)
当您这样做时,它会起作用,但箭头在移动时会自行重复,为了避免您需要更改 moveBy() 方法的最后一行,即:
mContext.invalidate(invalRect);
用这个:
mContext.invalidate();
【问题讨论】:
嗨,我想裁剪从相机拍摄的图像,有什么想法吗? 【参考方案1】:是的,有办法。但这并不容易。
查看图库应用的源代码。特别是 HighlightView.java。您将看到负责绘制箭头的方法仅在用户触摸边框时被调用。 所以你需要抓取 CropImage 活动的源代码。将其包含在您的 App 中并修改 HighlightView.java 的 draw() 方法以始终调用 drawResizeDrawables()。
这样做的好处是,您可以确保裁剪意图适用于所有设备,即使它们具有不支持裁剪意图的自定义库。
【讨论】:
谢谢@Renard 我开始寻找画廊的源代码,但在开始之前我需要确定,我将使用这个link 源代码,我想我没有机会只包括CropImage 和 HighlightView 因为它们也导入了其他类,所以我会将所有类带到我的项目中(对吗?)。我必须使用相同的包装名称吗?在该示例中为 com.android.camera.gallery 或者我可以在自定义包名称下使用它。最后一个问题,我应该如何改变我的意图,所以它会调用改变的画廊?谢谢! 是的,解决方案并不容易,因为您需要导入许多不同的类。我为我的一个项目做过一次,需要导入 5 个不同的类。包名当然可以更改。当你创建意图时,这样做: Intent intent = new Intent(this, CropImage.class);以上是关于Android MediaStore Crop 功能,如何让选择箭头始终可见?的主要内容,如果未能解决你的问题,请参考以下文章
Android MediaStore.ACTION_IMAGE_CAPTURE 和 Intent.ACTION_PICK
Android:通过 MTP 连接时如何检测 MediaStore 的变化