profile image

L o a d i n g . . .

반응형

 

안드로이드에서 기본으로 제공해주는 ProgressBar 나 seekBar를 이용하여 쉽게 드래그 느낌이 나는 바를 만들 수 있다.

많이 라이브러리가 있어 커스텀도 가능하지만 조금 복잡해서 내가 정말 원하는 간단한 기능을 구현하기에는 굳이 필요가 없다고 생각된다.

 

기존의 터치 이벤트와 x좌표만 가지고 드래그 느낌을 내는 레이아웃을 간단하게 만들 수 있다.

 

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LinearLayoutDragBar.LinearLayoutDragBar">

    <View
        android:id="@+id/dragbar_back"
        android:layout_width="match_parent"
        android:layout_height="20dp"
        android:background="@android:color/darker_gray"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toTopOf="parent"/>

    <View
        android:id="@+id/dragbar_thumb"
        android:layout_width="10dp"
        android:layout_height="20dp"
        android:background="@android:color/black"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toTopOf="parent"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="4"
        app:layout_constraintTop_toBottomOf="@+id/dragbar_back">

        <TextView
            android:id="@+id/grade_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="c#"/>

        <TextView
            android:id="@+id/grade_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="java"/>

        <TextView
            android:id="@+id/grade_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="kotlin"/>

        <TextView
            android:id="@+id/grade_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="php"/>

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

레이아웃은 특별한 거 없이 겹쳐있는 바 두개와 아래에는 보기 심심하니 아무거나 넣도록 하자

 

중요한건 배경이 되는 바와 움직이는 바 2개가 겹쳐져 있어야 한다는 것이다. 

 

다른 레이아웃을 사용해도 되지만 이제 ConstraintLayout이 가장 쉽게 느껴진다.

 

class LinearLayoutDragBar : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_linear_layout_drag_bar)

        // 기기의 넓이를 구한다.
        val dm : DisplayMetrics = getApplicationContext().getResources().getDisplayMetrics()

        dragbar_thumb.layoutParams.width = dm.widthPixels / 4

        dragbar_thumb.setOnTouchListener( object : View.OnTouchListener {
            override fun onTouch(v: View, event: MotionEvent): Boolean {
                when(event.action) {
                    MotionEvent.ACTION_MOVE -> {
                        v.setX(v.getX() + (event.getX()) - (v.getWidth()/2))
                    }
                    MotionEvent.ACTION_UP -> {
                        // 다시 처음으로
                        v.setX(0.0f)
                    }
                }
                return true
            }
        })

    }
}

코드도 정말 간단하다.

 

그저 우리가 움직여야 하는 바의 터치이벤트만 주면 된다.

사실 좌표구해서 이런 애니메이션효과를 내는 건 공부해보지도 실제로 해볼 경험도 없어서 구글을 통해 구현해냈다..

 

만약에 바탕이 되는 바를 터치하였을 때 그 지점으로 바가 움직여야 한다면

 

터치이벤트를 바탕이 되는 바에 만들어야 한다.

 

이걸 통해서 공부한건 기준점을 잘 잡아야 한다는 것과 코딩보단 계산이 더 힘들었다.

 

얼른 모션레이아웃이 정식으로 나와서 사용할 수 있게 되었으면..그럼 모션레이아웃을 또 공부해야겠지..또르르

반응형
복사했습니다!