[問題] canvas.clipPath()讓繪圖超出view的邊界

作者: csixty (shan)   2014-05-10 01:33:52
我想在某個 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>
執行畫面像這樣:http://ppt.cc/q7Vn
TestView 的背景是淡黃色,它的 parent 有設定 android:clipChildren="true",
這的確發揮了作用,便得藍線在超出 TestView 的邊界以外的部分不會被畫出來。
但紅線就不同了,由於 canvas.clipPath() 挖出一塊超出 TestView 的邊界的
三角形區域,使得之後的填綠色以及畫紅線都超出了 TestView 的邊界。
想當然爾的解法是,在建立 Path 的時候要小心別超出 TestView 的邊界,
或者將 Path 和 TestView 的範圍進行 Region.Op.INTERSECT,
但由於種種原因,我無法這麼做,不知有什麼方法可以在呼叫
canvas.clipPath() 之後可以隨意繪圖而不超出 view 的邊界?
感謝。
作者: tac0wu (在BBS中流浪)   2014-05-10 12:49:00
有趣 來研究一下你不能仰賴parent the clip來做intersect clip 你必須要自http://pastebin.com/L1aftPEp在沒看android source 下的不負責猜測是 因為你內層的clip Region已經把parent給你的clip給override掉了所以你內層要自己做一下intersect clip region如何做 就看我附上code的第二段如果要貼code還是用一下置底貼code的網站
作者: csixty (shan)   2014-05-10 18:14:00
感謝。你的code很有效。 ^__^原來,Path可以被Region來約束啊。
作者: wanilly   2014-05-11 15:39:00
小心用clipPath 因為HW加速下performance不怎麼好

Links booklink

Contact Us: admin [ a t ] ucptt.com