마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 bitmap에 대해서 다시 질문드립니다.

0 추천

전에 하나의 글을 이미올렸는대 해결되지 않아서 다시한번 올립니다.

저는 하나의 이미지를 12개로 분할하여 LinkedList에 저장했습니다.

ontouchEvent에서 이미지 두개를 터치하면 두개의 이미지의 위치가 바뀌게 만들려고합니다.

count 변수를 만들어서 2회가 클릭되면 바꾸게 할려고하는대

그 바꾸는 이미지를 어떻게 표현해야될지를몰르겠습니다.

밑에 스크립트처럼 두개의 좌표를 읽고 할려고하는데 여기서 머리가 막막해집니다.

조그마한 도움이라도 주시기바랍니다.

소중한 시간 내주셔서 긴글 읽어주셔서 감사합니다.

@Override
public boolean onTouchEvent(MotionEvent event) {
    int count = 0;
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        count++;
        if(count == 1)
        clickx = (int)event.getX();
        clicky = (int)event.getY();
        if(count == 2){
            clickx1 = (int)event.getX();
            clicky1 = (int)event.getY();
            count = 0;
        }
    }
    return true;
}
익명사용자 님이 2018년 10월 1일 질문

1개의 답변

0 추천

LinkedList에 들은 position을 각각 저장을 해두었다가 2개가 모이면 서로의 위치를 바꿔주면 될 것 같습니다.

바꾼 다음에 화면을 다시 표시해 주면 되겠지요.

update

public class CustomImageView extends AppCompatImageView implements View.OnTouchListener {
    private String TAG = getClass().getSimpleName();

    public CustomImageView(Context context) {
        super(context);
        setOnTouchListener(this);
    }

    public CustomImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setOnTouchListener(this);
    }

    public CustomImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOnTouchListener(this);
    }

    private ArrayList<Rect> positionList = new ArrayList<>();
    private ArrayList<Bitmap> imageList = new ArrayList<>();

    public void setImage(Bitmap image){

        int w = getResources().getDisplayMetrics().widthPixels;
        int h = getResources().getDisplayMetrics().heightPixels;

        int offset = Math.abs(image.getWidth() - w);
        image = Bitmap.createScaledBitmap(image, image.getWidth() - offset, image.getHeight() - offset, false);
        int sliceW= image.getWidth() / 4;
        int sliceH = image.getHeight()/3;
        for (int i = 0; i < 3; i++) {
            int y = sliceH * i;
            for (int i2 = 0; i2 < 4; i2++) {
                int x = sliceW * i2;
                Rect position = new Rect(x, y, x + sliceW, y + sliceH);
                positionList.add(position);
                imageList.add(Bitmap.createBitmap(image, x, y, sliceW, sliceH));
            }
        }
        invalidate();
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        for(int i = 0; i < imageList.size(); i++){
            Rect dst = positionList.get(i);
            Bitmap image = imageList.get(i);
            canvas.drawBitmap(image, new Rect(0, 0, dst.width(), dst.height()), dst, null);
        }
    }

    int position1 = -1;
    int position2 = -1;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            for(int i = 0; i < imageList.size(); i++){
                if(positionList.get(i).contains((int)event.getX(),(int)event.getY())){
                    if (position1 == -1){
                        position1 = i;
                    } else if (position2 == -1) {
                        position2 = i;
                    }
                    break;
                }
            }
            if (position1 > -1 && position2 > -1) {
                Collections.swap(imageList, position1, position2); //위치를 바꾸는 코드
                position1 = -1;
                position2 = -1;
                invalidate();
            }
            return true;
        }
        return false;
    }
}

말로 설명이 어려워 대충 코드를 짜봤습니다. 잘 해결되면 좋겠네요.

niss (3,110 포인트) 님이 2018년 10월 1일 답변
niss님이 2018년 10월 1일 수정
contains 해주는 리스트를 다른걸로 바꿔보세요. d라던가요. 그래도 안된다면 더 이상은 저도 모르겠군요.
마지막 하나만 더물어보겠습니다.
@Override
    public boolean onTouchEvent(MotionEvent event) {
        int checkcount = 0;
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            ++checkcount;
            if(checkcount == 1){
                for(int i = 0; i < l1.size(); i++){
                    if(l1.get(i).width() == (int)event.getX() && l1.get(i).height() == (int)event.getY()){
                        position1 = i;
                        Log.i("aa", "aa " + i);
                    }
                }
            }
            if(checkcount == 2){

                for(int i = 0; i < l1.size(); i++){
                    if(l1.get(i).width() == (int)event.getX() && l1.get(i).height() == (int)event.getY()){
                        position2 = i;
                        checkcount = 0;
                    }
                }
            }

            if (position1 > -1 && position2 > -1) {
                Collections.swap(l1, position1, position2);
                position1 = -1;
                position2 = -1;
                invalidate();
            }
        }
        return true;
    }

이렇게 새로짰는대
저기 if문에 보면 l1.get(i).width 를 하면 제가 설정한 l1 리스트에 들어있는 모든 width값이 해당되는게 아닌가요?
Log.i로 i를 찍어봤는대 클릭해보니 아무것도 안나오더라고요
l1.get(i).width() == (int)event.getX()
이렇게 하시면 값이 일치해야만 합니다. 하지만 손가락으로 터치해서 완벽하게 좌표를 찝을 수는 없죠.

그래서 Rect().contains(x, y) 로 체크하는 겁니다. Rect()는 사각형 좌표로 구성되기 때문에 터치좌표가 그 안에 들어가는지 체크해주는거에요.

아니면
l1.get(i).left <= (int)event.getX() || l1.get(i).right >= (int)event.getX()
이런식으로 해야겠죠.

그리고
int checkcount = 0;
는 밖에나 선언해주세요. 안에다 하면 카운트가 쌓이지 않습니다.
또 여쭤봐서 죄송합니다.
문제를 찾았습니다.
위에서 제가 썻던 이미지가 좌표가 0,0에 고정이되있고
저는 그것을 list로 씌웠더니 저런 문제가 나타났습니다.
혹시 처음 bitmap을 제가 원하는 위치에 맞출수가있나요?
초반에 설정을 어떻게 하나요?
li.get(0).left 를 log로 찍어봤는대 0이나오더라고요
이미지가 가장먼저 생성되는 좌표가 0,0인데 거기에 맞춰지더라고요
그래서 int w = bitmap.getwidth(); 이부분이로 가져올때
좌표를
0으로 가져오고싶은데 설정방법을몰릅니다.
onDraw 메소드에서 쓰신
canvas.drawBitmap(bitmap, r[index], d[i], paint);
이 부분이 비트맵을 그리는 부분이니까요. d[i] 데이터의 좌표가 최종적으로 그려지는 부분입니다. 이 부분의 좌표를 잘 구성하시면 됩니다.
...