2010-07-26 19 views
32
public class POCII extends Activity { 

    myView mv = new myView(this); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(mv); 
    } 
} 


class myView extends View { 

    public myView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 

     canvas.drawRect(0,0,100,100, paint); 
     canvas.clipRect(0,0,50,50); 
    } 
} 

मेरा प्रश्न है, उपर्युक्त कोड आयताकार नहीं खींचना चाहिए और फिर शीर्ष बाएं हिस्से को फसल करना चाहिए? आयताकार फसल नहीं हो रहा है।क्लिपआरक्ट का उपयोग करना - स्पष्टीकरण

कृपया बताएं कि क्लिपआरईटी क्या करता है। वास्तव में यह क्लिपिंग क्या है? क्या यह समन्वय के अनुसार एक आयत के रूप में क्लिप करता है? यदि हां, तो उपर्युक्त कोड क्यों काम नहीं कर रहा है?

+2

जांच http://youtu.be/vkTn3Ule4Ps?list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu –

उत्तर

66

कैनवास। clipRect(left, top, right, bottom) स्क्रीन के क्षेत्र को कम करता है जो भविष्य के ड्रॉ ऑपरेशंस को लिख सकता है। यह क्लिपबाउंड को वर्तमान क्लिपिंग आयताकार और आयताकार का विशाल चौराहे होने के लिए सेट करता है। क्लिपआरक्ट विधि के बहुत सारे रूप हैं जो क्षेत्रों के लिए विभिन्न रूपों को स्वीकार करते हैं और क्लिपिंग आयत पर विभिन्न संचालन की अनुमति देते हैं। आप स्पष्ट रूप से कतरन क्षेत्र स्थापित करने के लिए चाहते हैं, की कोशिश:

canvas.clipRect(left, top, right, bottom, Region.Op.REPLACE); 

5 वीं तर्क पिछले संस्करण के साथ चौराहे बनाने के बजाय कतरन आयत की जगह का मतलब है।

drawRect कथन से पहले clipRect कथन को स्थानांतरित करने का प्रयास करें। या, जोड़ने का प्रयास करें:

paint.setColor(Color.YELLOW); 
drawRect(0,0,75,75); 

आपके मौजूदा क्लिपरेक्ट कथन के बाद। यह आपके पास पहले की तुलना में 50x50 पीले वर्ग को आकर्षित करना चाहिए।

एक और नोट: (स्पष्ट रूप से, बड़े पैमाने पर अनियंत्रित व्यू/व्यू ग्रुप/ड्राइंग कोड के साथ लंबी निराशा के बाद) मैंने पाया कि कैनवास.ट्रांसलेट (एक्स, वाई) क्लिपआरक्ट को भी समायोजित करता है। क्लिपआरक्ट और ड्राइंग मैट्रिक्स की बातचीत बहुत भ्रमित है। यह पता मुद्रित करने के लिए उपयोगी है:

canvas.getMatrix() 

और

canvas.getClipBounds() 

से पहले और कैनवास में किए गए संशोधन के बाद और चीजों को निकालने से पहले।

+2

canvas.translate (एक्स, वाई) clipRect साथ खिलवाड़ पर टिप्पणी बहुत उपयोगी था। मुझे बहुत निराशा बचाई। धन्यवाद! –

+0

'Region.Op' के साथ विधियों को अब स्पष्ट रूप से बहिष्कृत कर दिया गया है। – Suragch

+0

क्लिप कैनवास से मूल कैनवास कैसे प्राप्त करें? –

3

ऊपरी बाएं भाग काटने के लिए, कार्य करें:

canvas.clipRect(0,0,50,50, Region.Op.DIFFERENCE); 
// secondly... 
canvas.drawRect(0,0,100,100, paint); 
4

आईसीएस और इसके बाद के संस्करण ...

XOR, अंतर और ReverseDifference क्लिप मोड आईसीएस द्वारा अनदेखी कर रहे हैं कि क्या हार्डवेयर त्वरण सक्षम है।

बस अपने दृश्य में 2 डी हार्डवेयर त्वरण अक्षम:

myView.setLayerType (View.LAYER_TYPE_SOFTWARE, नल);

संदर्भ Android: Howto use clipRect in API15

संबंधित मुद्दे