问题
I'm quite new to Android and i'm trying to draw on a custom view (with canvas). I've got some lines & rects there. The point is, that i now want to give the whole view rounded corners, but that doesn't work well, as i'm drawing on the view and my drawings are above the rounded corners, which were added through the ressources. Is there a possibility to add rounded corners, that cover the whole view?
Best regards and thank's for any help!
回答1:
I am not sure of your requirements. But you can use the below and modify the same
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rl"
android:background="@drawable/bkg" //set background
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</RelativeLayout>
bkg.xml
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#10EB0A"/> //set color
<stroke android:width="3dp" // set border
android:color="#0FECFF" /> //set border color
<padding android:left="5dp" //set padding
android:top="5dp"
android:right="5dp"
android:bottom="5dp"/>
<corners android:bottomRightRadius="20dp" //set radius
android:bottomLeftRadius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp"/>
</shape>
MainActivity.java
public class MainActivity extends Activity {
RelativeLayout rl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rl = (RelativeLayout) findViewById(R.id.rl);
CustomView cv = new CustomView(this);
rl.addView(cv); //add custom view to the relative layout
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class CustomView extends View
{
Bitmap bmp;
PaintDrawable mDrawable;
public CustomView(Context context) {
super(context);
bmp = BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawBitmap(bmp, 200, 200, null);
}
}
}
Snap shot
回答2:
public class RoundCornerView extends View{
public RoundCornerView(Context context) {
super(context);
}
public RoundCornerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RoundCornerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onDraw(android.graphics.Canvas canvas)
{
Paint paint = new Paint();
paint.setAlpha(255);
canvas.translate(0, 30);
paint.setColor(Color.BLUE);
Path mPath = new Path();
mPath.addRoundRect(new RectF(0, 0, 100,100),20,20, Path.Direction.CCW);
canvas.clipPath(mPath, Region.Op.INTERSECT);
paint.setColor(Color.GREEN);
paint.setAntiAlias(true);
canvas.drawRect(0, 0, 120,120,paint);
}
}
Try to use clippath, but just as a side note after 3.0 you need to turn off hardwareAccelerated in you're manifest
android:hardwareAccelerated="false"
There are solutions for that, when founded will post it here as an addition
来源:https://stackoverflow.com/questions/16791449/add-rounded-corners-to-custom-view