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.
nhận các vị trí liên lạc! http://stackoverflow.com/questions/3476779/how-to-get-the-touch-position-in-android –
@twntee: Vui lòng xem câu hỏi được cập nhật của tôi. – Ponting
Đ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