【问题标题】:How set imageview scaletype to topCrop如何将 imageview scaletype 设置为 topCrop
【发布时间】:2015-06-29 06:32:14
【问题描述】:

我正在编写 android 并且我有一个 imageview。我想将它的 scaletype 设置为 topcrop。 我可以在选项中找到 centercrop,但这不是我的要求。我该怎么做?

【问题讨论】:

    标签: android imageview scaletype


    【解决方案1】:

    自定义 Android ImageView 用于对包含的 drawable 进行顶部裁剪。

    import android.content.Context;
    import android.graphics.Matrix;
    import android.widget.ImageView;
    
    /**
    * ImageView to display top-crop scale of an image view.
    *
    * @author Chris Arriola
    */
    public class TopCropImageView extends ImageView {
    
    public TopCropImageView(Context context) {
        super(context);
        setScaleType(ScaleType.MATRIX);
    }
    
    @Override
    protected boolean setFrame(int l, int t, int r, int b) {
        final Matrix matrix = getImageMatrix();
    
        float scale;
        final int viewWidth = getWidth() - getPaddingLeft() - getPaddingRight();
        final int viewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
        final int drawableWidth = getDrawable().getIntrinsicWidth();
        final int drawableHeight = getDrawable().getIntrinsicHeight();
    
        if (drawableWidth * viewHeight > drawableHeight * viewWidth) {
            scale = (float) viewHeight / (float) drawableHeight;
        } else {
            scale = (float) viewWidth / (float) drawableWidth;
        }
    
        matrix.setScale(scale, scale);
        setImageMatrix(matrix);
    
        return super.setFrame(l, t, r, b);
    }        
    }
    

    https://gist.github.com/arriolac/3843346

    【讨论】:

    • 如何实现这一点。我问了一个关于这个stackoverflow.com/questions/32359213/…的问题。
    • @Jay 效果很好。我在 onLayout() 方法中进行矩阵计算,该方法在旋转时也被调用,而 setFrame 没有。
    • 我调用 super.setFrame(l, t, r, b);在开头或 getWidth() 将返回 0
    【解决方案2】:

    我只是想要一个没有多余工作的临时解决方案。试试这个

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        android:scrollY="-100dp"
        android:id="@+id/poster"
       />
    

    scrollY 向上或向下拉动您的图像。尝试使用不同的 dp,您会找到合适的尺寸。

    【讨论】:

    • 虽然这可以完成手头的任务,但它不适用于不同的屏幕分辨率或父视图大小。可能不推荐用于生产,因为你会在野外得到意想不到的结果。 :)
    • 是的,这是真的,我学得很辛苦。它在不同的屏幕上表现不同。
    • 我只需要稍微移动图像就可以了,谢谢。
    【解决方案3】:

    我认为您不需要为此自定义图像视图。您所要做的就是将scaleType 设置为matrix,并将自定义矩阵设置为ImageView

    参考:https://stackoverflow.com/a/38049348/4747587

    【讨论】:

      【解决方案4】:

      固定版本:

      • 尽快调用setFrame
      • 不重用 Matrix -> 当图像重新加载过快(使用毕加索)时,会导致图像缩放过多
      import android.content.Context
      import android.graphics.Matrix
      import android.util.AttributeSet
      import androidx.appcompat.widget.AppCompatImageView
      
      class TopCropImageView @JvmOverloads constructor(
          context: Context,
          attrs: AttributeSet? = null,
          defStyleAttr: Int = 0,
      ) : AppCompatImageView(context, attrs, defStyleAttr) {
      
          init {
              scaleType = ScaleType.MATRIX
          }
      
          override fun setFrame(l: Int, t: Int, r: Int, b: Int): Boolean {
              super.setFrame(l, t, r, b)
              val matrix = Matrix()
              val scale: Float
              val viewWidth: Int = width - paddingLeft - paddingRight
              val viewHeight: Int = height - paddingTop - paddingBottom
              val drawableWidth: Int = drawable.intrinsicWidth
              val drawableHeight: Int = drawable.intrinsicHeight
              scale = if (drawableWidth * viewHeight > drawableHeight * viewWidth) {
                  viewHeight.toFloat() / drawableHeight.toFloat()
              } else {
                  viewWidth.toFloat() / drawableWidth.toFloat()
              }
              matrix.setScale(scale, scale)
              imageMatrix = matrix
              return true
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多