私はAndroid開発に不慣れで、ImageViewに素晴らしく滑らかな丸みを帯びた角を追加しようと数時間試みましたが、成功しませんでした。
私が最初に試したのは、画像の角を直接丸めることですが、これはビットマップを変更することを意味します。生の画像を保持する必要があり、それらはかなり大きいため、これは実際にはメモリフレンドリーではありません。私のImageViewは流動的であるため、これは他の問題も引き起こします。
次に使用しようとしたのは、ビューをサブクラス化した後の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);
}
}
ご協力いただきありがとうございます!