프로그래밍

안드로이드 스튜디오 터치 이벤트

안드로이드 스튜디오
반응형

ONTOUCH EVENT

package com.example.touchevent;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    protected  class MyView extends View{
        int x=100, y=100;
        String str;

        public  MyView(Context context){
            super(context);
            setBackgroundColor(Color.RED);
        }

        @Override
        protected  void onDraw (Canvas canvas){
            Paint p = new Paint();
            p.setColor(Color.WHITE);
            canvas.drawCircle(x,y,50,p);
            p.setTextSize(70);
            canvas.drawText("액션 종류: "+str,10,100,p);
        }
        @Override
        public boolean onTouchEvent (MotionEvent event){
            x = (int) event.getX();
            y = (int) event.getY();

            if (event.getAction()==MotionEvent.ACTION_UP)
                str = "ACTION_UP";
            if (event.getAction()==MotionEvent.ACTION_DOWN)
                str = "ACTION+DOWN";
            if (event.getAction()==MotionEvent.ACTION_MOVE)
                str = "ACTION_MOVE";

            invalidate();
            return true;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyView myView = new MyView(this);
        setContentView(myView);
    }
}

실행 결과

액션  
ACTION_DOWN 누르는 동작 시작
ACTION_UP 누르고 있다가 떨어짐
ACTION_MOVE 누르는 도중 움직임
ACTION_CANCEL 터치 동작 취소
ACTION_OUTSIDE 터치가 현재 위젯을 벗어남

 

SINGLE TOUCH

 

 

package com.example.singletouch;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new Singletouchview(this, null));
    }
}

(Singletouchview.java)

package com.example.singletouch;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

import java.util.jar.Attributes;

public class Singletouchview extends View{
    private Paint paint = new Paint();
    private Path path = new Path();

    public Singletouchview(Context context, AttributeSet attrs){
        super(context,attrs);
        paint.setAntiAlias(true); 
        paint.setStrokeWidth(10f);
        paint.setColor(Color.rgb(255,176,194));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND); //페인트 속성 지정 (선 끝이 둥글게 함)
    }

    @Override
    protected void onDraw (Canvas can){
        can.drawPath(path,paint);
    }

    @Override
    public boolean onTouchEvent (MotionEvent event){
        float event_x = event.getX();
        float event_y = event.getY(); // 위치 좌표 불러오기

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN: // 화면에 터치가 시작되면
                path.moveTo(event_x,event_y); //지정된 좌표로 이동 (시작점)
                return true;
            case MotionEvent.ACTION_MOVE: //터치가 움직이면
                path.lineTo(event_x,event_y); //지정된 좌표까지 선을 긋는다
                break;
            case MotionEvent.ACTION_UP: //터치를 끝내면
                break;
            default:
                return false;
        }
        invalidate(); 
        return true;
    }
}

MultiTouch

package com.example.multitouch;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MultiTouchView(this,null));
    }
}
package com.example.multitouch;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class MultiTouchView extends View {

    private static final int SIZE = 60;
    final int MAX_POINT = 10;
    float[] x = new float[MAX_POINT];
    float[] y = new float[MAX_POINT];
    boolean[] touching = new boolean[MAX_POINT];

    private Paint mPaint;

    public  MultiTouchView(Context context, AttributeSet attrs){
        super(context,attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(Color.BLUE);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    }
    @Override
    public boolean onTouchEvent (MotionEvent event){
        int index = event.getActionIndex();
        int id = event.getPointerId(index);
        int action = event.getActionMasked();
        switch (action){
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_POINTER_DOWN:
                x[id] = (int) event.getX(index);
                y[id] = (int) event.getY(index);
                touching[id] = true;
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
            case MotionEvent.ACTION_CANCEL:
                touching[id] = false;
                break;
        }
        invalidate();
        return true;
    }

    @Override
    protected void onDraw (Canvas canvas){
        super.onDraw(canvas);

        for (int i = 0 ; i< MAX_POINT; i++) {
            if (touching[i])
                canvas.drawCircle(x[i], y[i], SIZE, mPaint);
        }
    }
}

 

실행 결과

scale gesture

package com.example.scale;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new imageview(this));
    }
}
package com.example.scale;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

import com.example.scale.R;

public class imageview extends View {
    private Drawable image;
    private ScaleGestureDetector gestureDetector;
    private float scale = 1.0f;
    public imageview(Context context) {
        super(context);
        image = context.getResources().getDrawable(R.drawable.lemon);
        setFocusable(true);
        image.setBounds(0, 0, image.getIntrinsicWidth(),
                image.getIntrinsicHeight());
        gestureDetector = new ScaleGestureDetector(context, new ScaleListener());
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        canvas.scale(scale, scale);
        image.draw(canvas);
        canvas.restore();
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        invalidate();
        return true;
    }
    private class ScaleListener extends
            ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            scale *= detector.getScaleFactor();
            if (scale < 0.1f)
                scale = 0.1f;
            if (scale > 10.0f)
                scale = 10.0f;
            invalidate();
            return true;
        }
    }
}

 

 

반응형