2017-11-11 12 views
13

मैं जब तक घुमाया गया दृश्य है एक दृश्य मेरी उंगली का पालन करते हैं और निम्नलिखित कोडलेआउट का समायोजन करके घुमाए गए दृश्य खींच पैरामीटर

@Override 
public boolean onTouch(View view, MotionEvent motionEvent) { 

    final int action = motionEvent.getActionMasked(); 
    int newPosX,newPosY; 
    switch (action) { 
     case MotionEvent.ACTION_DOWN: { 
      final int pointerIndex = motionEvent.getActionIndex(); 
      final float x = motionEvent.getX(pointerIndex); 
      final float y = motionEvent.getY(pointerIndex); 

      RelativeLayout.LayoutParams parms = (RelativeLayout.LayoutParams) view.getLayoutParams(); 

      // Remember where we started (for dragging) 
      mLastTouchX = (int) x; 
      mLastTouchY = (int) y; 
      // Save the ID of this pointer (for dragging) 
      mActivePointerId = motionEvent.getPointerId(0); 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      if(motionEvent.getPointerCount()==2){ 
       float newDist = spacing(motionEvent); 
       float scale = newDist/oldDist * view.getScaleX(); 
       view.setScaleY(scale); 
       view.setScaleX(scale); 

       float newAngle = rotation(motionEvent); 
       float a = newAngle - oldAngle; 
       view.animate().rotationBy(a).setDuration(0).setInterpolator(new LinearInterpolator()).start(); 
      } 
      // Find the index of the active pointer and fetch its position 
      final int pointerIndex = 
        motionEvent.findPointerIndex(mActivePointerId); 

      final float x = motionEvent.getX(pointerIndex); 
      final float y = motionEvent.getY(pointerIndex); 

      // Calculate the distance moved 
      final float dx = x - mLastTouchX; 
      final float dy = y - mLastTouchY; 
      RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); 

      layoutParams.leftMargin += dx; 
      layoutParams.topMargin += dy; 

      view.setLayoutParams(layoutParams); 

      break; 
     } 
     case MotionEvent.ACTION_POINTER_DOWN:{ 
      oldDist = spacing(motionEvent); 
      oldAngle = rotation(motionEvent); 
      break; 
     } 

     case MotionEvent.ACTION_UP: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_CANCEL: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_POINTER_UP: { 

      final int pointerIndex = motionEvent.getActionIndex(); 
      final int pointerId = motionEvent.getPointerId(pointerIndex); 

      if (pointerId == mActivePointerId) { 
       // This was our active pointer going up. Choose a new 
       // active pointer and adjust accordingly. 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       mLastTouchX = (int) motionEvent.getX(newPointerIndex); 
       mLastTouchY = (int) motionEvent.getY(newPointerIndex); 
       mActivePointerId = motionEvent.getPointerId(newPointerIndex); 
      } 
      break; 
     } 
    } 
    return true; 

} 
    private float spacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return (float) Math.sqrt(x * x + y * y); 
} 

private float rotation(MotionEvent event) { 
    double delta_x = (event.getX(0) - event.getX(1)); 
    double delta_y = (event.getY(0) - event.getY(1)); 
    double radians = Math.atan2(delta_y, delta_x); 
    return (float) Math.toDegrees(radians); 
} 

सब कुछ अच्छी तरह काम कर रहा है साथ मल्टीटच में कुछ रोटेशन और स्केलिंग करने के लिए कोशिश कर रहा हूँ। जब यह 90 डिग्री से ऊपर घूमता है और हम इसे खींचने की कोशिश करते हैं तो यह टच पॉइंट के आसपास कूद रहा है। मुझे लगता है कि

layoutParams.leftMargin += dx; 
layoutParams.topMargin += dy; 

setLayoutParams(layoutParams); 

मैं इस काम को सफलता के बिना पिछले दो दिनों से करने के लिए काम कर रहा हूं।

नोट: जो मैं प्राप्त करने का प्रयास कर रहा हूं वह देखने के लिए 2 अंगुलियों (एकल अंगूठी के साथ खींचें) के साथ घूमने और स्केल करने के लिए है मैंने Google के दस्तावेज़ से ड्रैग कोड का पालन किया ताकि उंगलियों को स्विच करते समय इसे कूद न सके। । मैं view.animate() घुमाने के लिए इसका उपयोग कर रहा हूं। RotationBy (ए) .setDuration (0) .setInterpolator (नया LinearInterpolator())। प्रारंभ();

क्योंकि जब मैं view.setRotate() का उपयोग करता हूं, तो दृश्य कंपन होता है।

संपादित करें 1: मैं

layoutParams.leftMargin += dx; 
layoutParams.topMargin += dy; 

हटा दिया और से बदल दिया: घूर्णन दृश्य कहीं नहीं जा रहा है के बाद भी

//To get the moved distance of the finger(X and Y) 

float diffX = motionEvent.getX(pointerIndex) - mLastTouchX; 
        float diffY = motionEvent.getY(pointerIndex) - mLastTouchY; 

//to get the distance from touch point and the top or left of the view 
        final float dx = motionEvent.getRawX() - (motionEvent.getRawX()-motionEvent.getX()); 
        final float dy = motionEvent.getRawY() - (motionEvent.getRawY()-motionEvent.getY()); 
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); 

//Settings appropriate value for the margin top and margin left. 

        layoutParams.leftMargin = (int) (((motionEvent.getRawX())-dx)+ diffX); 
        layoutParams.topMargin = (int) (((motionEvent.getRawY())-dy)+ diffY); 

अब। लेकिन जब मैं सक्रिय उंगली को वास्तविक स्थिति से चारों ओर कूदता हूं।

ACTION_POINTER_UP पर मैं सक्रिय उंगली

case MotionEvent.ACTION_POINTER_UP: { 

       final int pointerIndex = motionEvent.getActionIndex(); 
       final int pointerId = motionEvent.getPointerId(pointerIndex); 

       if (pointerId == mActivePointerId) { 
        // This was our active pointer going up. Choose a new 
        // active pointer and adjust accordingly. 
        final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
        Log.d(TAG,"New pointer index :"+newPointerIndex); 
        mLastTouchX = (int) motionEvent.getX(newPointerIndex); 
        mLastTouchY = (int) motionEvent.getY(newPointerIndex); 
        mActivePointerId = motionEvent.getPointerId(newPointerIndex); 
       } 
       break; 
      } 
+1

मुझे एक ही समस्या थी। बाद में मुझे मध्यम पर अद्भुत लेख और नमूना मिला। कृपया निम्नलिखित देखें। https://blog.uptech.team/how-to-create-snapchat-like-stickers-for-android-50512957c351। सादर Preethi –

उत्तर

1

आम तौर पर मैं जरूरत से ज्यादा क्रम पर देखने की स्थिति और आकार से छेड़छाड़ के खिलाफ सलाह देंगे शिफ्ट बदलने के लिए यह कर रहा हूं, यह लेआउट बेकार में प्रदर्शन को नियंत्रित करने के लिए कड़ी मेहनत और कम करती है अद्यतन करता है शायद ही कभी अच्छा लग रहा है।

इसके बजाय, यदि आप ओपन में तल्लीन नहीं करना चाहते, तो मेरी सलाह एक कस्टम दृश्य, होगा एक वर्ग है कि extend View जो आप बाद में अपने लेआउट एक्सएमएल, <com.packagename.MyCustomView ... /> में जोड़ने पैदा करते हैं। इस दृश्य में आपकी पूरी स्क्रीन का आकार होगा। आप @OverrideonDraw(Canvas canvas) विधि, यह आपको दृश्य के कैनवास देगा, आप व्यू में ग्राफिक्स को आकर्षित करने के लिए कैनवास का उपयोग कर सकते हैं।

लिखने invalidate(); आप onDraw() के अंत में प्रयास करने के लिए और कॉल OnDraw() फिर से उपलब्ध होने पर, आप उपयोगकर्ता को छू आपके विचार तो यह करने के लिए कुछ बूलियन जोड़ने बंद हो जाता है एक बार यह बुला बंद कर देना चाहिए देखें बताने के लिए।

अब स्पर्श, आप अपने जैसे दृश्यों को स्पर्श करने के लिए पंजीकरण कर सकते हैं लेकिन अपने कस्टम व्यू के अंदर और canvas.getWidth() और canvas.getHeight() से अपने दृश्य के आकार का उपयोग करने के लिए क्या करना है यह निर्धारित करने के लिए।

यदि आपको ऑन्रॉइड पर पहुंचने से पहले दृश्य के आकार की आवश्यकता है() onMeasure() ओवरराइड करें।

Summery

यह इतना आसान लग सकता है लेकिन यह नहीं है, और यह तेजी से है और कुशल छोड़ने, यदि आप सबसे अच्छा संभव परिणाम चाहते हैं और फिर कोड के बहुत सारे से डरते नहीं हैं ग्राफिक्स, चिकनी हो जाएगा आप ओपनजीएल का उपयोग करके ड्राइंग में देख सकते हैं लेकिन मैं आपको सलाह नहीं दूंगा कि आप क्या करने की कोशिश कर रहे हैं।

आशा है कि मैं समस्या को समझ गया और आपकी मदद की - शुभकामनाएं!

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