2013-09-16 2 views
6

Как сделать растровое изображение созданным кликабельным? Ниже приведен код, который я использовал для создания растрового изображения с использованием холста.Как сделать растровое изображение с использованием холста?

public class DrawView extends View implements OnClickListener 
{ 
    public DrawView(Context context) 
    { 
     super(context); 
     paint = new Paint(); 
     image = BitmapFactory.decodeResource(getResources(), R.drawable.andmrktsmall); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     super.onDraw(canvas); 
     int canWidth = canvas.getWidth(); 
     int canHeight = canvas.getHeight(); 
     int width = (canWidth - 200)/2; 
     int height = (canHeight - 100)/2; 
     Bitmap indexcanvas = Bitmap.createScaledBitmap(image, 200, 100, true); 
     canvas.drawBitmap(indexcanvas, width, height, paint); 
     this.setBackgroundColor(Color.YELLOW); 

    } 

    @Override 
    public void onClick(View v) 
    { 
     Toast.makeText(context, "View is clicked", 1).show(); 
    } 

} 
+0

ли вы имеете в виду, как HTML-MAP? -> http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_areamap – Daniel

+0

http://stackoverflow.com/questions/10710579/make-clickable-region-in-canvas-to-change-image или http://stackoverflow.com/questions/16451656/make-a-javascript-canvas-rectangle-clickable – Daniel

+0

Нет аномального события щелчка на растровом изображении. В основном, растровое изображение/представление должно быть доступно для кликов. – Prashanth

ответ

14

Установив OnClickListener на этом представлении, все это будет доступно для кликов (но не ограничивается вашим растровым изображением). Чтобы проверить, щелкнул ли пользователь только растровое изображение, вы должны переопределить onTouchEvent (событие MotionEvent) и проверить, совпадают ли координаты касания с растровым изображением.

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    float x = event.getX(); 
    float y = event.getY(); 
    switch(event.getAction()) 
    { 
     case MotionEvent.ACTION_DOWN: 
     //Check if the x and y position of the touch is inside the bitmap 
     if(x > bitmapXPosition && x < bitmapXPosition + bitmapWidth && y > bitmapYPosition && y < bitmapYPosition + bitmapHeight) 
     { 
      //Bitmap touched 
     } 
     return true; 
    } 
    return false; 
} 

Просто замените bitmapXPosition и bitmapYPosition с координатами, которые вы используете для рисования растрового изображения, и bitmapWidth и bitmapHeight с шириной и высотой вы используете, чтобы сделать это.

Также старайтесь не выделять память (создавать объекты) внутри метода onDraw() любого вида. Это плохо для исполнения.

EDIT

private Rect r; 
private Paint paint; 
Bitmap bitmap; 

public TestRect(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    paint = new Paint(); 
    paint.setColor(Color.BLUE); 
    r = new Rect(); 
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
} 

public TestRect(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    paint = new Paint(); 
    paint.setColor(Color.BLUE); 
    r = new Rect(); 
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
} 

public TestRect(Context context) { 
    super(context); 
    paint = new Paint(); 
    paint.setColor(Color.BLUE); 
    r = new Rect(); 
    bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
} 

@Override 
public void onDraw(Canvas c) 
{ 

    r.set(getWidth()/2, getHeight()/2, getWidth()/2 + 200, getHeight()/2 + 200); 
    //c.drawRect(r, paint); 
    c.drawBitmap(bitmap, null, r, paint); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    float x = event.getX(); 
    float y = event.getY(); 
    switch(event.getAction()) 
    { 
     case MotionEvent.ACTION_DOWN: 
     //Check if the x and y position of the touch is inside the bitmap 
     if(x > getWidth()/2 && x < getWidth()/2 + 200 && y > getHeight()/2 && y < getHeight()/2 + 200) 
     { 
      Log.e("TOUCHED", "X: " + x + " Y: " + y); 
      //Bitmap touched 
     } 
     return true; 
    } 
    return false; 
} 

Обращая растровое изображение с помощью Rect как ваших координат, вы можете проверить, если сенсорный внутри растрового изображения или нет. Кроме того, вместо того, что большой и уродливый «если» заявление, вы можете использовать

if(r.contains(x, y)) 
{ 
    //BITMAP TOUCHED 
} 
+0

Не работает. На событие касания сам не вызван прикосновением к изображению. – Prashanth

+0

Его следует вызывать каждый раз, когда вы касаетесь представления. Я обязательно проверю, но это то, что я использовал в некоторых проектах. – LuigiPower

+0

Просто попробовал в примерном проекте, он работает. Если вы хотите, я отредактирую свой пост, чтобы добавить образец кода. – LuigiPower

3
@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    int x=(int)event.getX(); 
    int y=(int)event.getY(); 
    if (drawable.getBounds().contains(x,y) && 
      event.getAction()==MotionEvent.ACTION_DOWN) 
     { 
      Log.e(TAG, "onTouchEvent: drawable touched "); 
      return true; 
     } 
     return false; 
    } 
Смежные вопросы