2016-07-16 14 views
5

Đây là một tình huống khó khăn để mô tả, vì vậy hãy chịu với tôi. Tôi đã được yêu cầu làm cho màn hình một 'vết HLV' một chút như thế này:Android - vẽ ImageView chính xác trên đầu trang của chế độ xem hiện tại trong lớp sâu hơn

enter image description here

Tuy nhiên, trong trường hợp của tôi, tôi cần phải 'kéo' một số hình ảnh cơ bản vào phía trước và hiển thị chúng trong một màu sắc khác nhau để làm cho chúng nổi bật. Tôi không thể xác định xem 'khung hình' của những hình ảnh này sẽ trước thời gian chạy. Cách tiếp cận của tôi là thêm một cái nhìn đen, bán đục (tôi gọi nó là một 'bức màn') che phủ toàn bộ màn hình, và sau đó thêm những hình ảnh mà tôi cần làm các bức tranh phụ của bức màn với một màu khác. EDIT Phần này rất dễ dàng và tôi không yêu cầu trợ giúp với điều này (đó là lý do tại sao đề xuất rằng đây là bản sao của câu hỏi được đề xuất không chính xác).

Tôi không tin rằng tôi có thể sử dụng bringToFront() hoặc setTranslationZ() vì những phương pháp này sẽ không mang lại cho ImageView tất cả các cách để trước màn của tôi. Vì vậy, những gì tôi đang cố gắng làm là lấy chính xác 'khung' của chế độ xem hình ảnh (x, y, chiều rộng và chiều cao) tương ứng với màn hình tổng thể và sau đó thử thêm chế độ xem hình ảnh mới bằng cách sử dụng drawable với cùng một khung. Một điều cũng quan trọng là phải biết rằng 'chế độ xem' cơ bản thực sự được tạo thành từ nhiều chế độ xem (bao gồm ngăn kéo trượt), đó là lý do tại sao tôi cần phải nhận tọa độ tương đối so với màn hình. Tôi hy vọng điều này có ý nghĩa.

Tôi có thể vẽ ImageView mới làm màn hình con của màn với màu sắc chính xác, nhưng vị trí và kích thước của hình ảnh bị tắt. Làm cách nào để tôi có thể vẽ chính xác số ImageView mới này lên đầu trang trước đó?

Tôi cũng mở cho các chiến lược khác (vì chiến lược này có vẻ không hoạt động). Cảm ơn bạn đã giúp đỡ.

@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

Bản sao có thể có của [Cách tạo hoạt động trong suốt trong android?] (Http://stackoverflow.com/questions/16332064/how-to-create-transparent-activity-in-android) – user5599807

+1

thử [this] (http : // pastebin.com/dg4CXx0f) – pskink

+0

@ user5599807 - không trùng lặp. Bài đăng đó chỉ hỏi một câu hỏi rất đơn giản, đó là cách vẽ một khung nhìn với nền nửa trong suốt. Tôi đã làm điều đó (dễ dàng). Câu hỏi của tôi là về cách đặt chế độ xem con trên chế độ xem mới ở vị trí chính xác và với kích thước chính xác. – Alex

Trả lời

0

Tôi đã tìm ra điều này. Tôi có hai vấn đề cơ bản.

Trước tiên, tôi đã nhận được khung của ImageView tất cả đều sai. Tôi cần thiết để có được các tọa độ bên trái và trên cùng cũng như chiều cao và chiều rộng của hình ảnh sau khi nó được vẽ. Đây là cách tôi làm điều đó (tôi thực sự chuyển đổi sang trái, trên, phải, dưới, nhưng phần còn lại rất dễ):

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

Sau đó, tôi tạo một lớp mới để vẽ. Đây là sự khác biệt lớn nhất từ ​​OP của tôi. Ban đầu, tôi đã nghĩ rằng tôi có thể chỉ cần thêm này như là một mới ImageView và thiết lập của nó LayoutParams để đặt nó nơi tôi muốn. Thay vào đó, tôi lên vết thương bằng PaintCanvas để làm bản vẽ, kích thước, và vị trí:

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

Vì vậy, đặt này lại với nhau, tất cả được tổ chức từ onCreate() như thế này;

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

Có thể có một chút vấn đề không rõ ràng, nhưng tôi hy vọng điều này sẽ giúp ai đó.

Các vấn đề liên quan