코틀린 개인 과제

로그인 앱 제작-2

songyooho 2024. 6. 25. 15:44

추가내용

-종료버튼에 눌린상태 효과 주기 

-intent데이터를 Pacelable을 이용해 클래스 객체로 전달하기

 

1. 종료버튼 눌린상태 효과 주기

1)selector

-drawable selector xml파일을 생성하여 눌렸을때와 안눌렸을때의 효과를 shape로 표현

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/black"/>
            <corners android:radius="15dp"/>
        </shape>
    </item>
    <item android:state_pressed="false">
        <shape>
            <solid android:color="@color/yellow"/>
            <corners android:radius="15dp"/>
        </shape>
    </item>
</selector>

-ConstraintLayout으로 버튼역할을 대신하고 내부에 이미지뷰와 텍스트뷰를 삽입

<androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/finish_button"
        android:background="@drawable/finish_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="40dp"
        android:layout_marginBottom="100dp"
        app:layout_constraintBottom_toBottomOf="parent">

        <ImageView
            android:id="@+id/pressed_icon"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginStart="124dp"
            android:src="@drawable/unclicked_icon"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" />

        <TextView
            android:id="@+id/pressed_text"
            android:layout_width="wrap_content"
            android:layout_height="40dp"
            android:gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:text="종료"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toEndOf="@+id/pressed_icon"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

2)버튼 눌렸을때와 아닐때 텍스트와  이미지효과는 selector로 바꿔주기 힘드므로 코드상에서 바꿔줌

=>setOnTouchListener로 눌린 상태로 움직인 상태로 구분

=>왜냐하면 selector에서의 효과는 마우스가 버튼범위에서 벗어나면 떼진것으로 간주하고 바로 적용되는데  MotionEvent.ACTION_UP으로 처리를 하면 마우스가 버튼범위에서 벗어나더라도 마우스 클릭을 떨어트려야 처리가됨

=>MotionEvent.ACTION_MOVE는 마우스 범위에서 벗어나지 않더라도 움직이기만 하면 처리가 되므로 isPressed로 움직였을때 눌린상태인지 아닌지를 체크해서 처리하도록 함.

val end=findViewById<ConstraintLayout>(R.id.finish_button)

        val btnText=findViewById<TextView>(R.id.pressed_text)
        val btnImage=findViewById<ImageView>(R.id.pressed_icon)

        end.setOnTouchListener { v: View, event: MotionEvent ->
            when(event.action) {
                MotionEvent.ACTION_DOWN -> {
                    btnText.setTextColor(Color.WHITE)
                    btnImage.setImageResource(R.drawable.clicked_icon)
                    false
                }
                MotionEvent.ACTION_MOVE ->{
                    if(!end.isPressed) {
                        btnText.setTextColor(Color.BLACK)
                        btnImage.setImageResource(R.drawable.unclicked_icon)
                    }

                    false
                }
                else -> false
            }
        }

 

 

2. Parcelable

1)우선 Parcelable을 상속받는 User클래스를 만들음

data class User(val id:String, val pass:String):Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString().toString(),
        parcel.readString().toString()
    ) {
    }

    override fun describeContents(): Int {
        return 0
    }

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest?.writeString(id)
        dest?.writeString(pass)
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }
    }
}

-클래스 뒤에 Parcelable을 붙인뒤 alt+enter로 필요한 멤버들 추가

 

2)intent에서 클래스 객체로 데이터 전달

intent.putExtra("user",User(idStr,passStr))

 

3)데이터를 받아서 사용

<1>SignInActivity

val user: User? =result.data!!.getParcelableExtra("user", User::class.java)
try {
    id.setText(user!!.id)
    pass.setText(user!!.pass)
}catch (e:Exception){
    e.printStackTrace()
}

<2>HomeActivity

val user=intent.getParcelableExtra("user",User::class.java)
val idstr=user!!.id
val id=findViewById<TextView>(R.id.idTextView)
id.setText("아이디:"+idstr)