2013-08-25 60 views
5

Trong ứng dụng Android của tôi, tôi có ba hình dạng không đều trên toàn cầu như sau:(Bố cục Android) cho nút Địa điểm ở phía trên hình ảnh có hình dạng bất thường hoặc phát hiện cảm ứng (vùng có thể chạm) của khu vực hình ảnh cụ thể?

enter image description here

Vì vậy, tôi đặt toàn bộ hình ảnh này trong cách bố trí. Globe is just an image .There is no role of globe here. Bây giờ, tôi muốn đặt một nút ở trên cùng của mỗi hình ảnh có hình dạng bất thường trên toàn cầu.

Nút luôn là hình chữ nhật nhưng I want to get touch event for irregular shape,not for rectangular area. Vậy làm cách nào tôi có thể đặt ba nút trên ba hình dạng bất thường này hoặc có giải pháp nào không? để sự kiện khác nhau cho mỗi nút có thể được xử lý trong hoạt động?

Tôi không có ý tưởng về cách thực hiện tác vụ này. Hãy hướng dẫn tôi về điều này.

Bất kỳ lời khuyên hoặc đề xuất nào?

Mọi trợ giúp sẽ được đánh giá cao.

+0

nhận các vị trí liên lạc! http://stackoverflow.com/questions/3476779/how-to-get-the-touch-position-in-android –

+0

@twntee: Vui lòng xem câu hỏi được cập nhật của tôi. – Ponting

+1

Điều này sẽ giúp bạn: http://stackoverflow.com/questions/11283653/real-custom-shape-of-button Ngoài ra, bạn có thể chia bố cục của mình thành các phân đoạn/vòng cung ảo và xử lý các sự kiện chạm. – JiTHiN

Trả lời

0

Từ câu trả lời ở trên, tôi đã gợi ý và cuối cùng tôi nhận được giải pháp như sau:

Những gì tôi đã làm là:

Dùng RelativeLayout trong file xml

đã qua sử dụng ImageView, như sau:

<ImageView 
     android:id="@+id/btn1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/glob2" 
     android:layout_marginBottom="24dp" 
     android:layout_marginLeft="80.5dp" 
     android:contentDescription="@string/profile_picture_description" 
     android:src="@drawable/pick_matches_background" /> 

Ở đây tôi đặt lề phù hợp (trái/phải/dưới cùng/trên cùng).

Trong hoạt động,

Declare

Bitmap btmp; and 
ImageView img; 

Trong onCreate Method,

// initialized image view 
img = (ImageView) findViewById(R.id.btn1); 
img.setOnClickListener(new View.OnClickListener() { 

public void onClick(View v) { 

     // call your method here 

    } 
}); 

StateListDrawable sdCreateTrip = (StateListDrawable) img 
      .getDrawable(); 

btmp = ((BitmapDrawable) sdCreateTrip.getCurrent()) 
      .getBitmap(); 

Bạn đã sẵn sàng để đi ngay bây giờ.

+0

Có vẻ như lề của bạn đang sử dụng các giá trị mã hóa cứng, cách hoạt động trên các kích thước màn hình khác nhau? – Mike

0

Cờ FLAG_WINDOW_IS_OBSCURED đã hoạt động tốt đối với tôi trong quá khứ nhưng có thể phải mất chút thời gian để làm việc. Nó có thể là giá trị một thử nhưng phải trung thực tôi vẫn không chắc chắn chính xác như thế nào nó xác định những gì là và không bị che khuất, vì vậy nó có thể không được áp dụng ở đây.

static OnTouchListener listenerMotionEvent = new OnTouchListener() { 
    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     if ((motionEvent.getFlags() | MotionEvent.FLAG_WINDOW_IS_OBSCURED) != MotionEvent.FLAG_WINDOW_IS_OBSCURED) { 
      return false; 
      // View is not obscured so we pass on the event 
     } 

     // Process the motion event here and return true if you consume it 
}; 
+0

Vui lòng xem câu hỏi được cập nhật của tôi. – Ponting

1

Tôi chưa thử nghiệm điều này, nhưng tôi nghĩ nó sẽ hoạt động. Tôi chắc chắn bạn sẽ phải tinh chỉnh và sửa chữa.

Tạo bản sao hình nền của bạn trong đó ba nút là ba màu riêng biệt không có răng cưa và tất cả các pixel khác là màu đen thuần túy. Nó cần phải là một PNG nên nó sẽ không có các tạo tác nén JPG. Đây sẽ là mặt nạ của bạn. Bạn chỉ có thể sử dụng màu đỏ, xanh lá cây và xanh lam thuần túy vì bạn chỉ có ba nút. Nó có thể có độ phân giải thấp hơn hình ảnh ban đầu của bạn, miễn là tỷ lệ cỡ ảnh là như nhau.

Xem lớp con ImageView và sử dụng lớp con của bạn thay vì vẽ nền. Chuyển phiên bản lớp ImageView của lớp con của bạn dưới dạng ảnh bitmap.

class TouchMaskImageView extends ImageView { 
    ...constructors 

    public void setTouchMask(Bitmap mask){ 
     this.mMask = mask; 
    } 

    public interface OnTouchedListener{ 
     public void onTouched(MotionEvent event, int colorTouched); 
     public void onTouchCanceled(); 
    } 

    public void setOnTouchedListener(OnTouchedListener listener){ 
     this.mOnTouchedListener = listener; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 
     if (mOnTouchedListener != null && mMask != null) { 
      if (x >=0 && x < (float)getWidth() && 
       y >=0 && y < (float)getHeight()) { 
       //Next two lines will be more complicated if 
        // you aren't using scaleType fitXY 
       int maskX = (int) x * mMask.getWidth()/getWidth(); 
       int maskY = (int) y * mMask.getWidth()/getHeight(); 
       int maskColor = mask.getPixel(maskX, maskY); 
       mOnTouchedListener.onTouched(event, maskColor); 
      } else if (event.getAction()==MotionEvent.UP){ 
       //released finger outside image view 
       mOnTouchedListener.onTouchCanceled(); 
      } 
     } 
    } 
} 

Bây giờ bạn có thể tạo một OnTouchedListener xử lý logic cảm ứng tương tự như nút. Nó sẽ cần phải theo dõi các trạng thái. Đây là một ví dụ, nhưng tôi không chắc chắn nếu điều này sẽ phá vỡ khi có đa chạm. Bạn cũng có thể cần đặt mặt nạ hành động cho ngón tay đầu tiên và sử dụng getActionMasked() thay vì getAction().

public void onTouched(MotionEvent event, int colorTouched){ 
    switch(mState){ 
    case STATE_WAITING: 
     if (event.getAction()==MotionEvent.ACTION_DOWN){ 
      switch (colorTouched){ 
      case 0xffff0000: //red 
       mTouchMaskImageView.setImageResource(R.drawable.redButtonDown); 
       mState = STATE_LATCHED_RED; 
       break; 
      case 0xff00ff00: //green 
       mTouchMaskImageView.setImageResource(R.drawable.greenButtonDown); 
       mState = STATE_LATCHED_GREEN; 
       break; 
      case 0xff0000ff: //blue 
       mTouchMaskImageView.setImageResource(R.drawable.blueButtonDown); 
       mState = STATE_LATCHED_BLUE; 
       break; 
      } 
     } 
     break; 
    case STATE_LATCHED_RED: 
     switch (event.getAction()){ 
     case (MotionEvent.ACTION_MOVE): 
      if (colorTouched = 0xffff0000) 
       mTouchMaskImageView.setImageResource(R.drawable.redButtonDown); 
      else 
       mTouchMaskImageView.setImageResource(R.drawable.defaultImage); 
      break; 
     case (MotionEvent.ACTION_UP) 
      if (colorTouched = 0xffff0000) 
       performRedButtonAction(); 
      mTouchMaskImageView.setImageResource(R.drawable.defaultImage); 
      mState = STATE_WAITING; 
      break; 
     } 
     break; 
    case etc. for other two latched colors... 
     break; 
    } 
} 

public void onTouchCanceled(){ 
    mTouchMaskImageView.setImageResource(R.drawable.defaultImage); 
    mState = STATE_WAITING; 
} 

Điều này hơi thô, vì bạn sẽ cần bốn bản sao khác nhau của hình ảnh để thể hiện bốn trạng thái có thể. Nếu bạn muốn dành thời gian để lưu một số bộ nhớ và làm cho bộ nhớ chạy nhanh hơn, bạn có thể thử thiết lập bố cục của mình bằng các chế độ xem hình ảnh riêng biệt cho ba nút được xếp chồng ở đúng vị trí và nhắm mục tiêu những thay đổi hình ảnh. Nhưng điều này sẽ rất khó khăn, xem xét bạn sẽ phải làm cho nó xếp hàng hoàn hảo cho bất kỳ kích thước màn hình.

+0

Dude, Điều này có vẻ như khái niệm cấp độ rất cao.Tôi chỉ là nhà phát triển ngây thơ. Cảm ơn câu trả lời.Chủ đề này http://stackoverflow.com/questions/11283653/real-custom-shape-of-button giải quyết vấn đề của tôi. – Ponting

+0

Giải pháp đó dễ hơn, nhưng bạn vẫn sẽ cần phải làm điều gì đó tương tự với khối mã thứ hai của tôi để làm cho nó hoạt động như một nút (hình ảnh nút thay đổi khi bạn nhấn vào nó, và bạn có thể hủy nút bấm bằng cách kéo tắt ngón tay của bạn trước khi phát hành). Bạn sẽ sử dụng chế độ xem hình ảnh riêng biệt cho mỗi nút? – Tenfour04

+0

Có. Tôi đang sử dụng chế độ xem hình ảnh riêng biệt. – Ponting

0

Sẽ cắt hình ảnh trong Photoshop, sau đó đặt hình ảnh đó trong trợ giúp về chế độ xem web?