android - Android ImageView 上的抗锯齿圆角

标签 android imageview rounded-corners antialiasing

<分区>

我是 android 开发的新手,我已经尝试了几个小时来为 ImageView 添加漂亮而平滑的圆角,但没有成功。

我尝试的第一件事就是直接对图像进行圆角处理,但这意味着要更改位图,而且由于我需要保留原始图像,而且这些图像非常大,这对内存来说并不是很友好。这也会导致其他困难,因为我的 ImageView 是流动的。

我尝试使用的第二件事是在对我的 View 进行子类化之后使用 clipPath 方法。这有效,但角落是别名的。然后我尝试添加一个 PaintFlagsDrawFilter 来实现别名,但这没有用。我正在使用 monodroid,我想知道这应该在 Java 中工作。

这是我的代码(C#):

public class MyImageView : ImageView
{
    private float[] roundedCorner;

    /**
     * Contains the rounded  corners for the view.
     * You can define one, four or height values.
     * This behaves as the css border-radius property
     * 
     * @see http://developer.android.com/reference/android/graphics/Path.html#addRoundRect(android.graphics.RectF, float[], android.graphics.Path.Direction)
     */
    public float[] RoundedCorners{
        get{
            return roundedCorner;
        }
        set{
            float[] finalValue = new float[8];
            int i=0;
            if(value.Length == 1){
                for(i=0; i<8;i++){
                    finalValue[i] = value[0];
                }
            }else if(value.Length == 4){
                for(i=0; i<4;i++){
                    finalValue[2*i] = value[i];
                    finalValue[2*i+1] = value[i];
                }
            }

            roundedCorner = finalValue;
        }
    }

    public SquareImageView (Context context) :
        base (context)
    {
        Initialize ();
    }

    public SquareImageView (Context context, IAttributeSet attrs) :
        base (context, attrs)
    {
        Initialize ();
    }

    private void Initialize ()
    {
        RoundedCorners = new float[]{0,0,0,0};
    }

    public override void Draw (Android.Graphics.Canvas canvas)
    {
        Path path = new Path();
        path.AddRoundRect(new RectF(0,0, Width,Height),RoundedCorners, Path.Direction.Cw);

        canvas.ClipPath(path);

        base.Draw (canvas);
    }

    /**
     *  try to add antialiasing.
             */
    protected override void DispatchDraw (Canvas canvas)
    {

        canvas.DrawFilter = new PaintFlagsDrawFilter((PaintFlags)1, PaintFlags.AntiAlias);
        base.DispatchDraw (canvas);
    }

}

感谢您的帮助!

最佳答案

我创建了一个 RoundedImageView基于 Romain Guy 的 example code将此逻辑包装到您应该能够使用的 ImageView 中。它开箱即用地支持边框和抗锯齿。

它比其他圆角示例更有效,因为它不创建位图的另一个副本,也不使用在 Canvas 上绘制两次的 clipPath。

关于android - Android ImageView 上的抗锯齿圆角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111707/

相关文章:

android - Titanium USB 热敏打印机驱动程序

java - 回收 ImageViews 以避免 OutOfMemoryError

jquery - 使用 jQuery 将照片边缘圆化

java - 我可以在 setOnClickListener 中调用 'cancel()' 吗?

java - Android 中不显示对话框标题

android - Flutter & Firestore : app. INotificationSideChannel$Stub$Proxy 错误

html - 内部元素应该被外部元素边界半径修剪

android - 两个 ImageViews 出现在导航标题中,而我只在 xml 中设置一个

android - 我想编写一个 ImageView 先缓慢旋转然后逐渐增加旋转速度的程序

c# - 如何在特定边界内绘制具有可变宽度边框的圆角矩形