我想在某個 custom view 裏進行繪圖,而且不想讓繪圖超出 view
的邊界,所以我在 layout file 中對此 view 的 parent ViewGroup 設定
android:clipChildren="true",這招有用,但遇到 canvas.clipPath()
指令就破功了,不知如何解決?
相關檔案有3個:TestActivity.java,TestView.java,test.xml (layout)。
主要內容如下:
[TestActivity.java]
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
}
}
[TestView.java]
public class TestView extends View {
public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
// build a triangle Path object
Path pie = new Path();
pie.moveTo(-50, 50);
pie.lineTo(360, 50);
pie.lineTo(150, 400);
pie.close();
// build a paint brush
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(20);
paint.setColor(Color.RED);
// draw green triangle and red line
canvas.save();
canvas.clipPath(pie, Region.Op.REPLACE);
canvas.drawColor(Color.GREEN);
canvas.drawLine(-30, 100, 330, 100, paint);
canvas.restore();
// draw another blue line
paint.setColor(Color.BLUE);
canvas.drawLine(-30, 250, 330, 250, paint);
}
}
[test.xml]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" android:clipChildren="true"
android:background="#cccccc">
<RelativeLayout
android:layout_width="200dp"
android:layout_height="350dp"
android:background="#ffffff"
android:layout_centerInParent="true"
android:clipChildren="true">
<com.example.TestView
android:id="@+id/testView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffdd"
android:layout_centerInParent="true"/>
</RelativeLayout>
</RelativeLayout>
執行畫面像這樣:
![]()
TestView 的背景是淡黃色,它的 parent 有設定 android:clipChildren="true",
這的確發揮了作用,便得藍線在超出 TestView 的邊界以外的部分不會被畫出來。
但紅線就不同了,由於 canvas.clipPath() 挖出一塊超出 TestView 的邊界的
三角形區域,使得之後的填綠色以及畫紅線都超出了 TestView 的邊界。
想當然爾的解法是,在建立 Path 的時候要小心別超出 TestView 的邊界,
或者將 Path 和 TestView 的範圍進行 Region.Op.INTERSECT,
但由於種種原因,我無法這麼做,不知有什麼方法可以在呼叫
canvas.clipPath() 之後可以隨意繪圖而不超出 view 的邊界?
感謝。