Java/Android圆形可绘制/位图-4种不同的半径和大小
我搜索了一下,但没有找到任何帮助我解决问题的线索: 我有一个ImageView,其中有一些图层是可绘制的,可以向该视图显示边界半径。此外,我还设置了jpg/png文件,该文件应该显示其背景(并且应该更像css,相当于类似于Java/Android圆形可绘制/位图-4种不同的半径和大小,java,android,android-layout,android-canvas,drawable,Java,Android,Android Layout,Android Canvas,Drawable,我搜索了一下,但没有找到任何帮助我解决问题的线索: 我有一个ImageView,其中有一些图层是可绘制的,可以向该视图显示边界半径。此外,我还设置了jpg/png文件,该文件应该显示其背景(并且应该更像css,相当于类似于'background-image:url(..)) 我的主要问题是,当jpg/png文件很小时,会出现一个问题,即首先将其弯曲,然后拉伸,导致结果图像看起来更像圆形,而不是带有圆角的拉伸矩形 重要提示:我有4个不同的角半径(从0到1000的任意数字),如腹板半径左上角、半径右
'background-image:url(..)
)
我的主要问题是,当jpg/png文件很小时,会出现一个问题,即首先将其弯曲,然后拉伸,导致结果图像看起来更像圆形,而不是带有圆角的拉伸矩形
重要提示:我有4个不同的角半径(从0到1000的任意数字),如腹板半径左上角、半径右上角等
有人遇到过这样的问题,或者知道更好的实现方法吗
我尝试添加使用自定义绘图:
public class RoundCornersBitmap extends PaintDrawable {
private Bitmap mBitmap;
private final Paint mPaint;
private final BitmapShader mShader;
private final ImageView mView;
public RoundCornersBitmap(Bitmap bmp, ImageView view) {
mBitmap = bmp;
mPaint = new Paint();
mShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
mPaint.setShader(mShader);
mPaint.setFlags(Paint.FILTER_BITMAP_FLAG);
mView = view;
//example corners
this.setCornerRadii(new float[]{50, 50, 120, 120, 90, 90, 40, 40});
}
@Override
public int getIntrinsicWidth() {
return mBitmap.getWidth();
}
@Override
public int getIntrinsicHeight() {
return mBitmap.getHeight();
}
@Override
public Paint getPaint() {
return mPaint;
}
@Override
public void draw(Canvas canvas) {
getShape().draw(canvas, mPaint);
}
}
我的图层列表如下所示:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#ff00ff"></solid>
<corners android:topLeftRadius="50px" android:topRightRadius="120px"
android:bottomLeftRadius="90px"
android:bottomRightRadius="40px"></corners>
<padding android:top="20px" android:left="20px" android:right="20px" android:bottom="20px"></padding>
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="#f0000f"></solid>
<corners android:topLeftRadius="50px" android:topRightRadius="120px"
android:bottomLeftRadius="90px"
android:bottomRightRadius="40px"></corners>
<padding android:top="1px" android:bottom="1px" android:left="1px" android:right="1px"></padding>
</shape>
</item>
</layer-list>
非常感谢您的帮助。我在imageview中找到了使用额外路径的解决方法:
Rect outRect = new Rect();
getDrawingRect(outRect);
mPath.addRoundRect(new RectF(outRect.left,outRect.top, width,height), floats_array, Path.Direction.CW);
并在onDraw中剪裁:
canvas.clipPath(mPath);
Rect outRect = new Rect();
getDrawingRect(outRect);
mPath.addRoundRect(new RectF(outRect.left,outRect.top, width,height), floats_array, Path.Direction.CW);
canvas.clipPath(mPath);