Выделите / выберите регион в растровом изображении - PullRequest
3 голосов
/ 17 апреля 2011

Я пытаюсь выбрать / выделить определенную позицию сетки на сенсорном экране. По сути, у меня есть изображение с холстом / растровым изображением поверх слоя изображения, я хочу иметь возможность щелкнуть точку изображения, и это поле будет выделено (первым шагом будет выделение сетки, я буду выполнить другие алгоритмы позже) ..

Вот код того, что у меня есть сейчас ... Я могу получить координаты x y, но я не знаю, как связать координаты x y с положением сетки.

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.MeasureSpec;


public class ImageWithGridView extends View {
    private int rows = 12;
    private int columns = 12;
    private float width;
    private float height;
    public static final String TAG="ImageWithGridView";
    private static final String SELX = "selX";
    private static final String SELY = "selY";
    private static final String VIEW_STATE = "viewState";
    //private static final int ID = 92;
    private int selX;   //X index of selection
    private int selY;   //Y index of selection
    private final Bitmap bitmap;
    public ImageWithGridView(Context context) {
        super(context);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample);
        //use your own image file name, instead of mobot_spring
        }

    public ImageWithGridView(Context context, AttributeSet attrs){
        super(context, attrs);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample);
        //TODO Auto-generated constructor sub
    }
    public ImageWithGridView(Context context, AttributeSet attrs, int defStyle) {
        super (context, attrs, defStyle);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample);
        //TODO Auto-generated constructor stub
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        Parcelable p = super.onSaveInstanceState();
        Log.d(TAG, "onSaveInstanceState");
        Bundle bundle = new Bundle();
        bundle.putInt(SELX, selY);
        bundle.putInt(SELY, selY);
        bundle.putParcelable(VIEW_STATE, p);
        return bundle;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        Log.d(TAG, "onRestoreInstanceState");
        Bundle bundle = (Bundle) state;
        selX = bundle.getInt(SELX);
        selY = bundle.getInt(SELY);
        super.onRestoreInstanceState(bundle.getParcelable(VIEW_STATE));
        return;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
        //adjust the ratio for width and height here:
        this.setMeasuredDimension(parentWidth, parentHeight*2/3);
    }

    @Override
    protected void onSizeChanged(int newWidth, int newHeight, int oldw, int oldh) {
        width = newWidth / (float) columns;
        height = newHeight / (float)rows;
        Log.d(TAG, "~~~~~~~~~~~onSizeChanged: width " + width + ", height " + height);
        super.onSizeChanged(newWidth, newWidth, oldw, oldh);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        RectF dst = new RectF(width, height, (columns-1) * width, (rows - 1) * height);
        //Draw the background...
        Paint background = new Paint();
        background.setColor(getResources().getColor(R.color.background));
        Log.d(TAG, "~~~~~~~~~10   ");
        canvas.drawRect(0, 0, getWidth(), getHeight(), background);
        Log.d(TAG, "~~~~~~~~~20   ");
        canvas.drawBitmap(bitmap, null, dst, null);
        Log.d(TAG, "~~~~~~~~~30   ");
        //Define colors for the grid lines
        Paint dark = new Paint();
        dark.setColor(getResources().getColor(R.color.dark));
        Paint hilite = new Paint();
        hilite.setColor(getResources().getColor(R.color.hilite));
        Paint light = new Paint();
        light.setColor(getResources().getColor(R.color.light));
        //Draw the minor grid lines

        for (int i = 0; i < rows; i++) {
            canvas.drawLine(0, i * height-1, getWidth(), i * height-1, dark);
            canvas.drawLine(0, i * height, getWidth(), i * height, light);
            canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite);
        }
        for (int i=0; i<columns; i++) {
            canvas.drawLine(i * width-1, 0, i* width-1, getHeight(), dark);
            canvas.drawLine(i * width, 0, i * width, getHeight(), light);
            canvas.drawLine(i * width + 1, 0, i* width + 1, getHeight(), hilite);
        }
        }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() != MotionEvent.ACTION_DOWN){
            return super.onTouchEvent(event);
        }
        selX = (int) event.getX();
        selY = (int) event.getY();
        Log.d(TAG, "onTouchEvent: x " + selX + ", y " + selY);
        return true;
        }
        public int getClickedX() {return selX;}
        public int getClickedY() {return selY;}
    }

Это мой другой класс

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;


public class CustomizeImageViewActivity extends Activity{

    /** Called when the activity is first created. */
        private Button  btnShow;
        private TextView label;
        private ImageWithGridView imgView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //setContentView(R.layout.relative_layout);
        //setContentView(R.layout.table_layout);
        btnShow = (Button) findViewById(R.id.btnShow);
        label = (TextView) findViewById(R.id.label);
        imgView = (ImageWithGridView)findViewById(R.id.imageView1);

        btnShow.setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        label.setText("("+imgView.getClickedX() + "," + imgView.getClickedY() + ")");
                    }
                });
    }
}

Посоветуйте, пожалуйста, какие-либо руководства / учебные пособия, на которые мне следует обратить внимание ... Я пытался провести какое-то исследование, но мне не удалось найти что-либо по этому вопросу.

...