【问题标题】:How to TOP CROP Image using PhotoView Android?如何使用 PhotoView Android TOP CROP 图像?
【发布时间】:2014-05-18 21:05:51
【问题描述】:

我有 1 个具有 layout_width 和 layout_height 的 ImageView 是 match_parent,其中两个是屏幕宽度和高度大小。我需要显示照片来填充全宽,当图像高于 ImageView 高度时,它可以上下滚动。我正在使用 PhotoView 库来缩放、滚动、点击……现在我正在使用 centerCrop 比例类型,但这不是我需要的解决方案。它显示了中心图像的一部分,我需要向上滚动才能从头开始查看。

我尝试了很多自定义视图扩展 ImageView 来显示 Top Crop 样式,但是当我触摸图像时,它更改为默认的 PhotoView 比例类型。仅在不使用 PhotoViewAttacher 时才有效

如何使用 PhotoView 库制作顶部裁剪和滚动 + 缩放 + 触摸...图像?

【问题讨论】:

    标签: android imageview crop


    【解决方案1】:

    您可以在 Chris Banes 的 PhotoView 的 PhotoViewAttacher 中的 updateBaseMatrix() 下实现更改 CENTER_CROP 比例的 TopCrop 比例。

    代码如下:

    else if (mScaleType == ScaleType.CENTER_CROP) {
       float scale = Math.max(widthScale, heightScale);
        mBaseMatrix.postScale(scale, scale);
        //Changed dy = 0 for top crop
        mBaseMatrix.postTranslate((viewWidth - drawableWidth * scale) / 2F, 0);
    

    来源:http://www.widecodes.com/fxSzNWPeVX/android-image-view-top-crop.html


    因为我让人们在 ImageView 中请求更多 scaleType:https://code.google.com/p/android/issues/detail?id=58468 我向 Chris Banes 的 PhotoView 添加了自定义比例类型。

    我给他发了一个 PR。由于我不知道他是否会接受 PR(或何时),您可以在我的 github 中获取项目:https://github.com/jonathanrz/PhotoView/ 并手动将 aar 添加到您的项目中。

    您可以在库内的示例项目中看到 CropTypeActivity 的使用示例。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • @bytecode77 我改进了答案。感谢您的建议。
    • 你知道底层矩阵是否可以用默认版本的PhotoView翻译?
    • @Niko 我不知道,你需要做什么?
    • 得到了我的案例的解决方案:stackoverflow.com/questions/33479400/…
    【解决方案2】:

    如果您不想修改 PhotoView 库, 这个解决方案如何使用 CustomAttacher 类。 继承 PhotoViewAttacher 然后重写 getDrawMatrix() 方法。

    public class CustomAttacher extends PhotoViewAttacher {
    
        public CustomAttacher(ImageView imageView) {
            this(imageView, true);
        }
    
        public CustomAttacher(ImageView imageView, boolean zoomable) {
            super(imageView, zoomable);
    
        }
    
        @Override
        public Matrix getDrawMatrix() {
            Matrix mx = super.getDrawMatrix();
            float[] values = new float[9];
            mx.getValues(values);
            values[Matrix.MTRANS_Y] = 0;
            mx.setValues(values);
            return mx;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2015-04-08
      • 2016-02-02
      • 2014-02-02
      • 2020-05-31
      • 1970-01-01
      相关资源
      最近更新 更多