μ΄λ κ² λλ κ²μ λ§λ€ κ²μ΄λ€.
μ‘°κΈ λ³΅μ‘ν΄ λ³΄μΌ μ μλλ°... γ μ²μ²ν λ°λΌ μ€λ©΄ μ½λ€.
볡μ‘νκ³ λͺ¨λ₯΄κ² μΌλ©΄ μΌλ¨ 볡λΆν΄μ λ£κ³ κ°μ λ°κΏ κ°λ©΄μ νμΈν΄ 보μκΈΈ..
0.
MainActivity.java
(ν¨ν€μ§λͺ κΉμ§ λ°λΌνμ§λ λ§ κ²... κ°νΉ κ·Έλ° μ¬λλ€λ μλ κ² κ°μμ.. νΉμλ)
μ±μ΄ μ€νλκ³ 2.5 μ΄ λ€μ λ²νΌμ΄ νμ±νλλ μ‘μ μ λ§λ€μ΄ 보μ.
package com.devshin93.drawabletest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.button);
// μ±μ΄ μ€νλκ³ 2.5μ΄ λ€μ λ²νΌμ΄ νμ±ν λλ€.
new android.os.Handler().postDelayed(new Runnable() {
@Override
public void run() {
btn.setEnabled(true);
}
}, 2500);
}
}
1.
activtity_main.xml
src > main > res > layout μμ ν μ€νΈ νμ΄μ§λ‘ μ¬μ©ν activity_main.xml μ λ§λ λ€. (μλλ‘μ΄λ νλ‘μ νΈκ° μμ±λλ©΄ κΈ°λ³ΈμΌλ‘ λ§λ€μ΄μ Έ μμ κ²μ΄κΈ΄ ν¨.)
activity_main.xml μ λ§λ€κ³ μμ μ½λλ₯Ό μμ±νλ€κ³ ν΄μ λΉλ λμ§ μλλ€. @drawable/btn_ripple κ³Ό @drawable/txt_color κ° μ λ§λ€μ΄μ Έ μκΈ° λλ¬Έ. μλμμ λ§λ€ κ²
μ£Όμν μ 1. λ²νΌμ λ§λλ λ° λ²νΌ νκ·Έκ° <Button μ΄ μλ, <android.appcompat.widget.AppCompatButton μΌλ‘ μμνλ€.
μ£Όμν μ 2. λ²νΌμ μκΉμ λ°κΏ μ£ΌκΈ° μν΄ android:background="@drawable/btn_ripple" μ μΆκ°νλ€.
μ£Όμν μ 3. λ²νΌμ μκΉμ΄ λ°λμ λ°λΌ λ²νΌ μμ ν μ€νΈ μκΉλ λ°κΏ μ£ΌκΈ° μν΄ android:textColor="@drawable/txt_color" μ μΆκ°νλ€.
μ£Όμν μ 4. λ²νΌμ΄ νμ±ν λκ±°λ λΉνμ±ν λ¨μ λ°λΌ μμ λ°κΏ μ£ΌκΈ° μν΄ android:enable:"false" λλ "true" λ‘ νλ€. (μ무 κ°λ μλ€λ©΄, λν΄νΈλ true μ΄λ€.)
(μ¬κΈ°μμ false λ true λ‘ μΌμ΄μ€μ λ°λΌ λ°λλ μ½λλ java μμ μμ±νλ€.)
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:background="@drawable/btn_ripple"
android:textColor="@drawable/txt_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:enabled="false"/>
</androidx.constraintlayout.widget.ConstraintLayout>
2.
btn_disable.xml
src > main > res > drawable μμ μλ‘μ΄ shape λ₯Ό μμ±νλ€.
μλ‘μ΄ νμΌ μμ±νλ λ°©λ²
android:enable="false" μΌ λ κ°μ§κ² λ λ²νΌμ λͺ¨μ λ° μκΉμ΄λ€.
android:shape="rectangle" : λͺ¨μμ μ¬κ°ν
android:padding="10dp" : μ¬κ°ν λͺ¨μ μμ λ€μ΄ μ¬ ν μ€νΈμ ν¨λ© κ°
android:color="#CBCBCB" : μ¬κ°νμ μκΉ
android:bottomLeftRadius="5dp" ... λ±μ radius : λͺ¨μ리μ κ°(?) 0dp λ‘ κ° μλ‘ λΎ°μ‘±νκ³ , κ°μ΄ μ»€μ§ μλ‘ λ₯κ·Ό λͺ¨μμ΄ λλ€.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding = "10dp">
<solid android:color="#CBCBCB"/>
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"/>
</shape>
Split μ λλ₯΄λ©΄ λ§λ€κ³ μλ λͺ¨μμ νμΈνλ©΄μ λ§λ€ μ μλ€.
λͺ¨μ리μ μκΉμ νμΈν΄ 보μ.
3.
btn_normal.xml
src > main > res > drawable μμ μλ‘μ΄ shape λ₯Ό μμ±νλ€.
android:enable="true" μΌ λ κ°μ§κ² λ λ²νΌμ λͺ¨μ λ° μκΉμ΄λ€.
2λ²κ³Ό λ€λ₯Έ κ²μ android:color κ° λΏμ΄λ€.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" android:padding = "10dp">
<solid android:color="#1473E6"/>
<corners
android:bottomLeftRadius="5dp"
android:bottomRightRadius="5dp"
android:topLeftRadius="5dp"
android:topRightRadius="5dp"/>
</shape>
λͺ¨μ리μ μκΉμ νμΈνμ.
4.
btn_ok.xml
src > main > res > drawable μμ μλ‘μ΄ selector λ₯Ό μμ±νλ€.
<selector μμλ <item λ€μ΄ λ€μ΄κ°κ² λλ€.
android:state_enabled="true" μΈ κ²½μ°, μ΄λ€ λͺ¨μμ λ²νΌμ κ°μ§κ² λ μ§ μ ν΄μ£Όκ³ , <!-- 3λ²μμ λ§λ€μ΄ μ€ btn_normal.xml μ μ¬μ©νμ. -->
android:state_enabled="false" μΈ κ²½μ°, μ΄λ€ λͺ¨μμ λ²νΌμ κ°μ§κ² λ μ§ μ ν΄μ€λ€. <!-- 2λ²μμ λ§λ€μ΄ μ€ btn_disable μ μ¬μ©νμ. -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="true"
android:drawable="@drawable/btn_normal"/>
<item
android:state_enabled="false"
android:drawable="@drawable/btn_disable"/>
</selector>
μμ΄ν μ μνμ λ°λΌ μμμ λ§λ€μ΄μ€ xml λ‘ λ°λλ€.
5.
btn_ripple.xml
src > main > res > drawable μμ μλ‘μ΄ ripple μ μμ±νλ€.
ripple : μλ¬Όκ²° (μ¬μ μ μλ―Έ)
ripple μ λ²νΌμ λλ μ λ, μΌμμ μΌλ‘ λ°λλ κ²μ λ§νλ€. 4λ²μμ λ§λ€μ΄ μ€ btn_ok.xml μ μ¬μ©νλ€.
android:color="@color/white" <!-- λ²νΌμ λλ μ λ μΌμμ μΌλ‘ νμμμΌλ‘ λ°λμλ€ λμ μ¨λ€. -->
android:drawable="@drawable/btn_ok" <!-- 4λ²μμ λ§λ btn_ok.xml μ¬μ© -->
btn_ripple.xml μ 1λ²μμ android:background="@drawable/btn_ripple" λ‘ λ€μ΄κ°κ² λλ€.
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/white">
<item android:drawable="@drawable/btn_ok"/>
</ripple>
μΌμμ μΌλ‘ λ°λλ μκΉμ νμμμΌλ‘,
λ²νΌμ μκΉμ μμμ λ§λ€μ΄ μ€ btn_ok(νμ μκΉμ΄ νλμμ΄μ΄μ 미리보기μμλ νλμΌλ‘ λ¨λ 보λ€)
6.
txt_color.xml
src > main > res > drawable μμ μλ‘μ΄ selector μ μμ±νλ€.
2~5λ²μ λ²νΌμ μκΉκ³Ό λͺ¨μμ μ‘μμ£ΌκΈ° μν¨μ΄μκ³ ,
6λ²μ λ²νΌμ΄ λ³ν¨μ λ°λΌ ν μ€νΈμ μκΉμ λ°κΏ μ£ΌκΈ° μν΄ μμ±νλ μ½λμ΄λ€.
txt_color.xml μ 1λ²μμ android:textColor="@drawable/txt_color" λ‘ λ€μ΄κ°κ² λλ€.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true"
android:color="#FFFFFF" />
<item android:state_enabled="false"
android:color="#AEAEAE" />
</selector>
#FFFFFF μ #AEAEAE λ λ―Έλ¬νκ² λ€λ¦!! νμκ³Ό νμ!
λκΈ