추가내용
-종료버튼에 눌린상태 효과 주기
-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)
'코틀린 개인 과제' 카테고리의 다른 글
회원가입 MVVM 과제 (0) | 2024.07.14 |
---|---|
챌린지반 3주차 첫번째 과제: 디자인 패턴 구현 (0) | 2024.07.09 |
로그인 앱 제작 (0) | 2024.06.19 |
키오스크 제작 (0) | 2024.06.13 |
수식입력이 가능한 계산기 만들기 (0) | 2024.06.04 |