onTouch 이벤트 /뷰 이동 / 뷰 드래그 앤 드랍 / 레이아웃 밖으로 못나가게 하기 :: 안드로이드 설치 및 개발[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

안드로이드 설치 및 개발
[1]
등록일:2018-10-15 16:31:51 (0%)
작성자:
제목:onTouch 이벤트 /뷰 이동 / 뷰 드래그 앤 드랍 / 레이아웃 밖으로 못나가게 하기

* 오늘은 뷰(버튼 이나 텍스트뷰 같은)를 드래그해서 원하는 위치에 옮기는 예제를 준비했습니다.

* 아래 보는 것처럼 TextView를 클릭한 상태에서 드래그를 하면 원하는 위치에 이동시킬수 있습니다.

* 또한 뷰가 레이아웃 영역밖으로 나가지 못하도록 처리하였습니다.



* 원리

onTouchListener를 이용합니다.

onTouchListener를 옮기고자하는 뷰에 setOnTouchListener 메소드를 이용해 설정해주면 해당 뷰는 터치이벤트에 대한 이벤트 처리를 할수 있습니다.

터치 이벤트 발생 Action의 순서는 Down -> Move -> Up 으로 진행됩니다.


- 처리 과정

1. Down (뷰를 터치했을 때 최초 한 번만 발생하는 Action)

 뷰를 터치하게되면 터치한 뷰의 상대적인 위치값을 변수에 저장해 놓아야 합니다. ( getX,Y() 메서드를 사용합니다. )

 이유는 터치하고 이동시키려고 할때 터치 시작지점과 뷰와의 이격을 없애기 위함입니다.


2. Move (Down Action 이후에 뷰를 드래그 했을 때 지속적으로 발생하는 Action)

 디바이스 전체 크기에서의 절대적인 위치를 가져오는 getRawX,Y() 메서드를 이용하여 전체 화면에서 터치 지점의 위치를 가져옵니다. 이격을 없애 주기 위해

 Down Action 에서 저장한 뷰의 상대적인 위치 값을 빼주면 됩니다.


3. Up (터치한 뷰에서 손을 때었을 때 최종적으로 발생하는 Action)

  Up Action 에서 중요한점은 뷰가 레이아웃 영역 밖에있는 상태에서 Up Action 이 발생하였다면 레이아웃 안으로 옴겨줘야 하는 점입니다. (코드를 참고해주세요)


- AndroidManifest.xml

theme를 액션바가 없는 테마로 바꾸어줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="utf-8"?>
    package="com.example.myapplication">
 
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
</manifest>
cs


- activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapplication.MainActivity">
 
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:text="Movemnet"
        android:textSize="30dp"
        android:textStyle="bold"
        />
</RelativeLayout>                                Colored by Color Scripter
cs


- MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.example.myapplication;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity implements View.OnTouchListener {
    TextView textView;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.text);
        textView.setOnTouchListener(this);
 
    }
 
    float oldXvalue;
    float oldYvalue;
 
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int width = ((ViewGroup) v.getParent()).getWidth() - v.getWidth();
        int height = ((ViewGroup) v.getParent()).getHeight() - v.getHeight();
 
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            oldXvalue = event.getX();
            oldYvalue = event.getY();
            //  Log.i("Tag1", "Action Down X" + event.getX() + "," + event.getY());
            Log.i("Tag1""Action Down rX " + event.getRawX() + "," + event.getRawY());
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            v.setX(event.getRawX() - oldXvalue);
            v.setY(event.getRawY() - (oldYvalue + v.getHeight()));
            //  Log.i("Tag2", "Action Down " + me.getRawX() + "," + me.getRawY());
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
 
            if (v.getX() > width && v.getY() > height) {
                v.setX(width);
                v.setY(height);
            } else if (v.getX() < 0 && v.getY() > height) {
                v.setX(0);
                v.setY(height);
            } else if (v.getX() > width && v.getY() < 0) {
                v.setX(width);
                v.setY(0);
            } else if (v.getX() < 0 && v.getY() < 0) {
                v.setX(0);
                v.setY(0);
            } else if (v.getX() < 0 || v.getX() > width) {
                if (v.getX() < 0) {
                    v.setX(0);
                    v.setY(event.getRawY() - oldYvalue - v.getHeight());
                } else {
                    v.setX(width);
                    v.setY(event.getRawY() - oldYvalue - v.getHeight());
                }
            } else if (v.getY() < 0 || v.getY() > height) {
                if (v.getY() < 0) {
                    v.setX(event.getRawX() - oldXvalue);
                    v.setY(0);
                } else {
                    v.setX(event.getRawX() - oldXvalue);
                    v.setY(height);
                }
            }
 
 
        }
        return true;
    }
}
 
cs

[본문링크] onTouch 이벤트 /뷰 이동 / 뷰 드래그 앤 드랍 / 레이아웃 밖으로 못나가게 하기
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34859
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.