2016-07-16 5 views
5

में मौजूदा दृश्य के शीर्ष पर छवि दृश्य को चित्रित करना यह वर्णन करने में एक कठिन परिस्थिति है, इसलिए कृपया मेरे साथ भालू। मैं इस तरह एक छोटा सा एक 'कोच के निशान' स्क्रीन बनाने के लिए कहा गया है:एंड्रॉइड - गहरी परत

enter image description here

हालांकि, मेरे मामले में मैं अंतर्निहित छवियों में से कुछ सामने 'पुल' की जरूरत है और उन्हें प्रदर्शित उन्हें अलग करने के लिए एक अलग रंग में। मैं निर्धारित नहीं कर सकता कि इन छवियों का 'फ्रेम' रन टाइम से पहले क्या होगा। मेरा दृष्टिकोण एक काला, अर्ध-अपारदर्शी दृश्य (मैं इसे 'पर्दे' कहता हूं) को पूरी स्क्रीन को कवर करना है, और फिर उन छवियों को जोड़ना जिन्हें मुझे एक अलग रंग के साथ पर्दे के सबव्यूज़ के रूप में चाहिए। EDIT यह हिस्सा आसान है और मैं इसके साथ सहायता मांग नहीं रहा हूं (यही कारण है कि सुझाव है कि यह सुझाए गए प्रश्न का डुप्लिकेट गलत है)।

मैं नहीं मानता कि मैं bringToFront() या setTranslationZ() उपयोग कर सकते हैं क्योंकि इन तरीकों मेरी पर्दा के सामने से ImageView सभी तरह लाना नहीं होंगे। तो, मैं जो करने की कोशिश कर रहा हूं उसे छवि दृश्य (इसकी एक्स, वाई, चौड़ाई, और ऊंचाई) का सटीक 'फ्रेम' प्राप्त होता है समग्र स्क्रीन के सापेक्ष और फिर उसी का उपयोग करके नया चित्र दृश्य जोड़ने का प्रयास करें एक ही फ्रेम के साथ आकर्षित करने योग्य।

यह जानना भी महत्वपूर्ण है कि अंतर्निहित 'व्यू' वास्तव में कई विचारों (स्लाइडिंग ड्रॉवर समेत) से बना है, इसलिए मुझे स्क्रीन के सापेक्ष निर्देशांक प्राप्त करने की आवश्यकता है। मुझे लगता है कि इसका मतलब बनता है।

मैं सही रंग के साथ पर्दे के सबव्यू के रूप में नया ImageView आकर्षित करने में सक्षम हूं, लेकिन छवि की स्थिति और आकार बंद है। मैं इस नए ImageView को पिछले एक के शीर्ष पर कैसे आकर्षित कर सकता हूं?

मैं अन्य रणनीतियों के लिए भी खुला हूं (क्योंकि यह काम नहीं कर रहा है)। हर प्रकार की सहायता के लिए आपका धन्यवाद।

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ... 

    ViewTreeObserver vto = mRootview.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      mRootview.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

      mDrawerLayout.openDrawer(Gravity.LEFT); 

      RelativeLayout curtain = addOpaqueCurtainToRootView(); 
      int frame[] = getFrameOfExistingImageView(); 
      addNewImageViewOnTopOfEverything(curtain, frame); 
     } 
    }); 
} 

private RelativeLayout addOpaqueCurtainToRootView() { 
    RelativeLayout curtain = new RelativeLayout(context); 
    RelativeLayout.LayoutParams curtainParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); 
    curtain.setLayoutParams(curtainParams); 
    curtain.setBackgroundColor(Color.argb(179, 0, 0, 0)); //70% opaque 
    mRootview.addView(curtain); 
    return curtain; 
} 

private int[] getFrameOfExistingImageView() { 
    // proving that I have a reference to the original image 
    mCurrentImage.setColorFilter(Color.rgb(255, 0, 0)); 

    int array[] = new int[2]; 
    mCurrentImage.getLocationOnScreen(array); 
    Log.d(TAG, "width: " + Integer.toString(array[0])); 
    Log.d(TAG, "height: " + Integer.toString(array[1])); 
    Log.d(TAG, "x: " + Float.toString(mCurrentImage.getX())); 
    Log.d(TAG, "y: " + Float.toString(mCurrentImage.getY())); 

    int frame[] = new int[4]; // x,y,width,height 
    frame[0] = (int)mCurrentImage.getX(); 
    frame[1] = (int)mCurrentImage.getY(); 
    frame[2] = array[0]; 
    frame[3] = array[1]; 
    return frame; 
} 

private void addNewImageViewOnTopOfEverything(RelativeLayout curtain, int[] frame) { 
    ImageView iv = new ImageView(context); 
    iv.setImageResource(R.drawable.imgView); 
    iv.setColorFilter(Color.rgb(255, 255, 255)); 
    iv.setX(frame[0]); 
    iv.setY(frame[1]); 
    iv.setLayoutParams(new RelativeLayout.LayoutParams(frame[2], frame[3])); 

    curtain.addView(iv); 
} 
+0

संभावित डुप्लिकेट [एंड्रॉइड में पारदर्शी गतिविधि कैसे बनाएं?] (Http://stackoverflow.com/questions/16332064/how-to-create-transparent-activity-in-android) – user5599807

+1

कोशिश करें [यह] (http : // pastebin।कॉम/डीजी 4 सीएक्सएक्स 0 एफ) – pskink

+0

@ user5599807 - डुप्लिकेट नहीं। वह पोस्ट सिर्फ एक बहुत ही सरल सवाल पूछता है, जो एक अर्द्ध पारदर्शी पृष्ठभूमि के साथ एक दृश्य आकर्षित करने के लिए है। मैं पहले से ही कर रहा हूँ (आसानी से)। मेरा सवाल यह है कि उस नए दृश्य पर एक सटीक स्थिति में और सटीक आकार के साथ बच्चे के विचारों को कैसे रखा जाए। – Alex

उत्तर

0

मैंने इसे समझ लिया। मुझे दो बुनियादी समस्याएं थीं।

सबसे पहले, मुझे ImageView का फ्रेम सभी गलत हो रहा था। मुझे बाएं और शीर्ष निर्देशांक और छवि के आकार और चौड़ाई को खींचने के बाद प्राप्त करने की आवश्यकता थी। यह मैं कैसे कर रहा हूँ कि (मैं वास्तव में छोड़ दिया, शीर्ष, सही, नीचे करने के लिए परिवर्तित कर रहा हूँ, लेकिन बाकी के लिए आसान है) है:

private int[] getFrameOfImageView(ImageView imageView) { 

    int array[] = new int[2]; 
    imageView.getLocationOnScreen(array); 

    int frame[] = new int[4]; 

    frame[0] = array[0]; // left 
    frame[1] = array[1]; // top 
    frame[2] = array[0] + imageView.getWidth(); // right 
    frame[3] = array[1] + imageView.getHeight(); // bottom 

    return frame; 
} 

फिर, मैं ड्राइंग करने के लिए एक नया वर्ग बनाया। यह मेरे ओपी से सबसे बड़ा अंतर है। मूल रूप से, मैं सोच रहा था कि मैं इसे एक नए ImageView के रूप में जोड़ सकता हूं और इसे LayoutParams सेट कर सकता हूं जहां मैं चाहता था। इसके बजाय, मैं Paint और Canvas आकार का उपयोग कर ड्राइंग करने के लिए, को बंद कर, और प्लेसमेंट:

public class CanvasPainter extends View { 

    Context mContext; 
    Drawable mDrawable; 

    int mFrame[]; 
    int left; 
    int top; 
    int right; 
    int bottom; 
    int width; 
    int height; 

    private final int LEFT = 0; 
    private final int TOP = 1; 
    private final int RIGHT = 2; 
    private final int BOTTOM = 3; 

    public CanvasPainter(Context context, int frame[], Drawable drawable) { 
     super(context); 

     mContext = context; 
     mFrame = frame; 
     mDrawable = drawable; 

     left = frame[LEFT]; 
     top = frame[TOP]; 
     right = frame[RIGHT]; 
     bottom = frame[BOTTOM]; 
     width = right - left; 
     height = bottom - top; 

    } 

    public void onDraw(Canvas canvas) { 
     Paint paint = new Paint(); 
     paint.setStyle(Paint.Style.FILL); 


     Bitmap b = ((BitmapDrawable) mDrawable).getBitmap(); 
     Bitmap bitmapResized = Bitmap.createScaledBitmap(b, width, height, false); 

     canvas.drawBitmap(bitmapResized, left, top, paint); 
    } 
} 

तो, यह एक साथ रखा, यह सब onCreate() इस तरह से संगठित हो जाता है;

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ... 

    mDrawerLayout.openDrawer(Gravity.LEFT); 

    ViewTreeObserver vto = mRootview.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      mRootview.getViewTreeObserver().removeOnGlobalLayoutListener(this); 

      RelativeLayout curtain = addOpaqueCurtainToRootView(); 
      int frame[] = getFrameOfExistingImageView(); 
      Drawable d = ContextCompat.getDrawable(context, R.drawable.imgView); 
      CanvasPainter canvasPainter = new CanvasPainter(context, mCurrentImg, frame, d); 
      curtain.addView(canvasPainter); 
     } 
    }); 
} 

थोड़ा अस्पष्ट समस्या हो सकती है, लेकिन मुझे उम्मीद है कि इससे किसी की मदद मिलती है।

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