2016-07-16 4 views
5

Dies ist eine schwierige Situation zu beschreiben, also bitte bitte mit mir. Ich habe ein ‚Trainer Marken‘ Bildschirm ein wenig wie diese gefragt zu machen: sieAndroid - Zeichnung ImageView genau auf der vorhandenen Ansicht in der tieferen Schicht

enter image description here

Allerdings habe ich in meinem Fall müssen ‚Pull‘ einige der zugrunde liegenden Bilder auf die Vorder und angezeigt werden in einer anderen Farbe, um sie hervorzuheben. Ich kann nicht bestimmen, was der 'Rahmen' dieser Bilder vor der Laufzeit sein wird. Mein Ansatz ist es, eine schwarze, halb-undurchsichtige Ansicht (ich nenne es einen Vorhang) für den gesamten Bildschirm hinzuzufügen und dann die Bilder, die ich brauche, als Unteransichten des Vorhangs mit einer anderen Farbe hinzuzufügen. EDIT Dieser Teil ist einfach und ich bitte nicht um Hilfe (weshalb der Vorschlag, dass dies ein Duplikat der vorgeschlagenen Frage ist, falsch ist).

Ich glaube nicht, dass ich bringToFront() oder setTranslationZ() weil diese Methoden nicht den ImageView den ganzen Weg an die Front meines Vorhangs bringen kann. Also, was ich versuche zu tun ist, um den genauen "Rahmen" der Bildansicht (x, y, Breite und Höhe) relativ zum gesamten Bildschirm zu bekommen und dann versuchen, die neue Bildansicht mit dem gleichen hinzuzufügen mit demselben Rahmen zeichnen.

Es ist auch wichtig zu wissen, dass die zugrunde liegende "Ansicht" tatsächlich aus mehreren Ansichten (einschließlich einer Schublade) besteht, weshalb ich die Koordinaten relativ zum Bildschirm erhalten muss. Ich hoffe das macht Sinn.

Ich kann die neue ImageView als Unteransicht des Vorhangs mit der richtigen Farbe zeichnen, aber die Position und Größe des Bildes ist weg. Wie kann ich diese neue ImageView genau auf die vorherige zeichnen?

Ich bin auch offen für andere Strategien (seit dieser scheint nicht zu funktionieren). Danke für jede Hilfe.

@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

Mögliches Duplikat von [Wie in Android transparent Aktivität erstellen?] (Http://stackoverflow.com/questions/16332064/how-to-create-transparent-activity-in-android) – user5599807

+1

try [diese] (http : // Pastebin.com/dg4CXx0f) – pskink

+0

@ user5599807 - kein Duplikat. Dieser Beitrag stellt nur eine sehr einfache Frage, wie man eine Ansicht mit einem halbtransparenten Hintergrund zeichnet. Ich mache das schon (leicht). Meine Frage bezieht sich darauf, wie Kinderansichten auf diese neue Ansicht in einer präzisen Position und mit einer genauen Größe platziert werden. – Alex

Antwort

0

Ich habe das herausgefunden. Ich hatte zwei grundlegende Probleme.

Zuerst bekam ich den Rahmen der ImageView alles falsch. Ich musste die linken und oberen Koordinaten und auch die Höhe und Breite des Bildes nach dem Zeichnen erhalten. Dies ist, wie ich tue, dass (ich bin Umwandlung tatsächlich nach links, oben, rechts, unten, aber der Rest ist einfach):

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; 
} 

Dann habe ich eine neue Klasse, die Zeichnung zu tun. Dies ist der größte Unterschied zu meinem OP. Ursprünglich dachte ich, dass ich das einfach als neues ImageView hinzufügen und LayoutParams setzen könnte, um es dort zu platzieren, wo ich es wollte. Stattdessen gewickelt ich Paint und Canvas mit bis zu der Zeichnung zu tun, Dimensionierung und Platzierung:

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); 
    } 
} 

Also, das zusammen, das alles von onCreate() wie diese organisiert wird;

Könnte ein bisschen ein obskures Problem sein, aber ich hoffe, das hilft jemandem.