์ก๋คํ ์๋ก
์กธ์ ํ๋ก์ ํธ ๊ธฐํ์ด ๋๋๊ณ ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์์ํ๊ฒ ๋์๋ค. ๊ทธ์ ์ ์ฐ๋ฆฌ ํ์ ์ํฉ์ ์๊ธฐํด๋ณด์๋ฉด ์๋๋ฅผ ์น+๋ฅ๋ฌ๋์ผ๋ก ๊ธฐํ์ ํ ํฐ๋ผ ์คํ๋ง๊ณผ ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃฐ ์ค ์๋ ํ์๋ค๋ก ํ์ ๊ตฌ์ฑํ๋ค. ๊ทธ๋ฐ๋ฐ ์ค์๊ฐ ๋ ธํธ ๋ณํ์ ํด์ฃผ๋ TarsosDSP๊ฐ ์๋๋ก์ด๋์ ์ ํฉํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด์ ์๋๋ก์ด๋๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๊ณ , ์ฌ์ฉ์๊ฐ ๋ ธ๋๋ฅผ ํ๋ฉด ๊ทธ๊ฒ์ ์๋ผ์ฃผ๋ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์จ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฅ๊ณ ๋ ์ฌ์ฉํ๊ฒ ๋์๋ค. ๊ทธ๋ฌ๋๋ ์๋์ฒ๋ผ ์ผ๋ ๋ฒ๋ ๊ตฌ์กฐ๊ฐ ๋์๋ค.
๋ฉํ ๋๊ป ์ฌ์ญค๋ณด๋ ๊ด์ฐฎ๋ค๊ณ ๋ ํ์ จ์ง๋ง, ์๋ฒ์ ๊ธฐ๋ฅ์ด ๋๋ ์ ธ์๋ค๋ ๊ฒ์ด ์กฐ๊ธ ์ด์ํ๋ค๊ณ ํด์ ๊ทธ๋ฅ ์๋๋ก์ด๋ ์์์ ๋ชจ๋ ๊ฒ์ ํด๊ฒฐํ๊ธฐ๋ก ํ๋ค.
์ด๋ ๊ฒ ๊ตฌํํด๋ ์๋ํ๋๋ฐ ๋ฌธ์ ๋ ์์ ๊ฒ ๊ฐ์์. ์ด๋ฏธ ๊ตฌํ๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ด๋๋ก ๊ตฌํํ์ ๋ ์๊ด์์ ๊ฒ ๊ฐ์์. ๋ค๋ง ์กฐ๊ธ ์ด์ํ ๊ฑด, ์๋ฒ์ฌ์ด๋์ ๊ธฐ๋ฅ์ด ์ฌ๋ฌ๊ตฐ๋ฐ ๋๋์ด์ ธ ์๋๊ฒ ์กฐ๊ธ ์ด์ํ๋ค์. Storage ์ ์ญํ ๋ก Firebase ๋ฅผ ์จ์ผํ๊ณ , ์์ ๋ถ์์ ์ํด Django ๋ฅผ ์จ์ผํ๊ณ , ์ต์ํ ๊ฑด Spring Boot ๋ผ ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ๋๊ฑธ๊น์? ๊ฐ์ฅ ๊น๋ํ ๊ตฌ์กฐ๋ผ๋ฉด ์๋ฒ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ๋์ ํ๋ ์์ํฌ์์ ๊ตฌํํ๊ณ , ํน์ ๊ตฌํ ์๋๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๊ทธ ์๋ฒ ํ๋ ์์ํฌ์์ ์ฐ๋ํ๋๊ฒ ์ ์ผ ๊น๋ํ ๊ตฌ์กฐ์ผ ๊ฒ ๊ฐ์์. ์๋ง Django ๋ฅผ ์จ์ผํ ๊ฒ ๊ฐ๋ค์. ์๋ง ์์ ๋ถ์ ์ชฝ์ ์ํด Django ๋ฅผ ๋ฐ๋์ ์จ์ผ๋ง ํ ๊ฒ ๊ฐ์ผ๋...
์ด๋ ๊ฒ ํด์ ์๋๋ก์ด๋ ๊ฒฝํ์ด ์๋ ํ์ ์ ์ด ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์ฒ์์ผ๋ก ์์ํ๊ฒ ๋์๋ค^^
์ด๋ฒ ํฌ์คํธ์์๋ ์๋๋ก์ด๋๋ฅผ ์ฒ์ ๊ฐ๋ฐํ๋ฉด์ ๋ง์ฃผ์ณค๋ ์ด๋ ค์ด ๋ถ๋ถ์ ์จ๋ณด๋ ค๊ณ ํ๋ค.
1. SharedPreference๋ฅผ ์ด์ฉํ ์ํ ์ ์ฅ
๊ฐ๋ฐ์ ์งํํ๋ค๋ณด๋ฉด, ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํ๋ ์ํฉ์ด ์ข ์ข ์๋ค. ์ฐ๋ฆฌ ํ์ ๊ฒฝ์ฐ ์์ญ๋ ํ ์คํธ์์ ๊ณ ์ ํ ์คํธ๋ฅผ ๋ง์น๊ณ ๋๋ฉด isHighDone ๋ณ์๊ฐ true๋ก ๋ฐ๋์ด์ผ ํ๊ณ ์ ์ ํ ์คํธ๋ฅผ ๋ง์น๋ฉด isLowDone ๋ณ์๊ฐ true๋ก ๋ฐ๋์ด์ผ ํ๋ค. ๊ทธ๋์ ๋ ๋ณ์๊ฐ ๋ชจ๋ true์ฌ์ผ ๋ค์ ์กํฐ๋นํฐ๋ก ๊ฐ๋ ๋ฒํผ์ด ํ์ฑํ๋๋ ์์ด์๋๋ฐ, ๋ฌธ์ ๋ ์์ญ๋ ํ ์คํธ ๋๊ธฐ ํ๋ฉด -> ์์ญ๋ ํ ์คํธ ์งํ ํ๋ฉด -> ์์ญ๋ ํ ์คํธ ์๋ฃ ํ๋ฉด์ผ๋ก ์กํฐ๋นํฐ๊ฐ ๋์ด๊ฐ๋ค๋ณด๋, ํด๋น ๋ณ์์ ๊ฐ์ด ์ ์ฅ๋์ง ์์๋ค. ์ด๊ฑธ ํ๋ํ๋ intent๋ก ๋๊ฒจ์ค ์๋ ์๋ ์ผ์ด๋ผ ๊ณ ๋ฏผํ๋๋ฐ, ๊ทธ๋ด ๋ SharedPreference๋ฅผ ์ด์ฉํด์ ์ํ๋ฅผ ์ ์ฅํ๋ฉด ์ข๋ค.
SharedPreference๋?
์ฑ ๋ด ๊ฐ๋ณ ์ ์ฅ์์ xml ํ์ผ์ ๋ง๋ค๊ณ , ํด๋น ํ์ผ์ key/value ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์. ํด๋น ๋ฐ์ดํฐ๋ ์ฑ ๋ด๋ถ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ์ฑ๊ณผ ๊ณต์ ํ ์ ์์ผ๋ฉฐ ์ฑ์ ์ญ์ ํ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ ๋ชจ๋ ์ฌ๋ผ์ง๋ค.
1) SharedPreference ๊ฐ์ฒด ์์ฑ ๋ฐ ํธ์ถ
๊ธฐ๋ณธ์ ์ผ๋ก SharedPreference๋ฅผ ์ ์ธํ ํ, onCreate ํจ์ ์์์ getSharedPreferences()๋ฅผ ์ด์ฉํด ํด๋น ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ค.
getSharedPreferences(String name, int mode);
์ ๊ทผ ๊ถํ์ ๋ฐ๋ผ mode๋ฅผ ์ฌ๋ฌ ๊ฐ ์ค์ ํ ์ ์๋๋ฐ ๊ทธ๋ฅ ๊ธฐ๋ณธ ๋ชจ๋์ธ MODE_PRIVATE๋ก ์ ์ธํด์ฃผ์๋ค.
(MODE_PRIVATE : ์์ฑํ ์ดํ๋ฆฌ์ผ์ด์ ์์๋ง ์ฌ์ฉํ ์ ์๋ ๋ชจ๋)
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ํ ์คํธ ์๋ฃ ์ฌ๋ถ๋ฅผ ์ฌ์ฉ์๋ณ๋ก ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ sharedPrefFile์ด ๊ตฌ๋ณ๋๋๋ก ์์ฑ ๊ฒฝ๋ก์ ์ฌ์ฉ์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ์๋ค.
private SharedPreferences mPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
String sharedPrefFile = "com.example.android."+userEmail+".SharedPreferences";
mPreferences = getSharedPreferences(sharedPrefFile, MODE_PRIVATE);
}
2) SharedPreference์ ๊ฐ ์ ์ฅํ๊ธฐ
SharedPreferences.Editor๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ ์ฅํ๋ค.
editor์ ์ํ๋ ๊ฐ์ key-value ํํ๋ก ๋ฃ์ด์ค ํ, ๋ง์ง๋ง์ ๊ผญ apply()๋ commit() ํจ์๋ฅผ ํธ์ถํด์ผ ์ ์ฅ์ด ๋๋ค.
private void ApplySharedPreference() {
SharedPreferences.Editor preferencesEditor = mPreferences.edit();
if (octaveHighLow.equals("high"))
preferencesEditor.putBoolean("isHighDone", true);
else if (octaveHighLow.equals("low"))
preferencesEditor.putBoolean("isLowDone", true);
preferencesEditor.apply();
}
3) SharedPreference์์ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ
getString, getBoolean ๋ฑ์ ์ด์ฉํด์ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค. key๊ฐ๊ณผ ํด๋น ๊ฐ์ด ์์ ๋์ default value๋ฅผ ์ ์ธํด์ฃผ์.
getBoolean(key, default value)
private Boolean isHighDone;
private Boolean isLowDone;
isHighDone = mPreference.getBoolean("isHighDone", false);
isLowDone = mPreference.getBoolean("isLowDone", false);
์ํ๋ฅผ ์ ์ฅํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค
์ฌ์ค ์ํ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ง๋ค. ๊ฐ๋จํ๊ฒ ์ ์ด๋ณด๋ฉด
1) SharedPreference
์ผ์ข ์ ํ์ผ ์ฐ๊ธฐ์ ๋น์ทํ๋ฉฐ, ํ๋ฉด์ด ๊บผ์ ธ๋ ๊ฐ์ด ๋จ์์๋ค. ๊ทธ๋ฌ๋ ์ค๋๋ ๋ฐฉ๋ฒ์ด๋ผ ์ถ์ฒํ์ง๋ ์๋๋ค.
2) DataStore
SharedPreference์ ๋จ์ ์ ๊ทน๋ณตํ ๋ฐ์ดํฐ ์ ์ฅ์.
- ์ฝ๋ฃจํด๊ณผ Flow๋ฅผ ํตํด ์ฝ๊ณ ์ฐ๊ธฐ์ ๋ํ ๋น๋๊ธฐ API๋ฅผ ์ ๊ณตํ๋ค.
- UI ์ค๋ ๋๋ฅผ ํธ์ถํด๋ ์์ ํ๋ค.
- runtime exception์ผ๋ก๋ถํฐ ์์ ํ๋ค.
3) ViewModel
Activity๋ Fragment์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ฌ UI ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ํด๋์ค
4) ์๋ฒ ์์ฒด์ ์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ
์ด๋๋ ๋๋ ์ถ์ง๋ง ์ค์ ๋ก ์ฌ์ฉ์์ ์ ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๋ ์ผ์ด ๋ง๋ค๊ณ ํ๋ค! ํ์ฌ๋ค์ ์ ์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ฑ ๋ค์ํ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ์๋ ์๋๋ก์ด๋์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ ์ํ์์ ๊ธํ๊ฒ ๊ฐ๋ฐ์ ํ๋๋ผ SharedPreference๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ณธ์ธ์ด ์ถฉ๋ถํ ์ฌ์ ๊ฐ ์๋ค๋ฉด View Model์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ํจ์ฌ ์ข์ ๊ฒ ๊ฐ๋ค!
SharedPreference vs SavedInstanceState
์ฒ์์๋ SavedInstanceState๋ฅผ ํธ์ถํ์ผ๋, ์กํฐ๋นํฐ ์ฌ๋ฌ ๊ฐ๋ฅผ ์๋ค๊ฐ๋คํ๋ ์ฐ๋ฆฌ ์ฑ์ ํน์ฑ์ savedInstanceState๊ฐ ์์ ์ด๊ธฐํ๋๋ ์ผ์ด ์ฆ์๋ค. ๊ทธ๋์ ์ฐพ์๋ณด๋ค๊ฐ SharedPreference๋ฅผ ์ฌ์ฉํ๊ฒ ๋์๋๋ฐ, ์ด ๊น์ ๋์ ๊ฐ๋จํ๊ฒ ๋น๊ตํด๋ณด๋ ค๊ณ ํ๋ค.
1) SharedPreference
- ์ฑ ๋ด ํ์ผ ํํ๋ก ์ ์ฅ๋์ด ์์ผ๋ฉฐ, ์ฃผ๋ก ์ค์ ํ์ผ๋ก ์ฌ์ฉ๋๋ค.
- ์ฑ์ ์ญ์ ํ์ง ์๋ ํ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ๊ณ์ ๋จ์์๋ค. ๋ฐ๋ผ์ ํ๋ฉด์ ๋๊ฑฐ๋ ์ฑ์ ์ข ๋ฃํด๋ ๋ฐ์ดํฐ๊ฐ ๋จ์์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฒ ํธ์ถํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ ์ฉํ๋ค.
2) SavedInstanceState
- ์กํฐ๋นํฐ ๋ด์ ์ํ๋ฅผ ์ ์ฅํ ๋ ์ฌ์ฉ๋๋ฉฐ, ์ฃผ๋ก ํ๋ฉด ํ์ ์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
- ํ๋ฉด์ด ํ์ ํ ๋๋ onCreate()์ onDestroy()๊ฐ ๋ค์ ๋ถ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ค์ ํด๋ ๋ณ์ ๊ฐ์ด ๋ชจ๋ ์ด๊ธฐํ๋๋๋ฐ, savedInstanceState๋ฅผ ์ด์ฉํด์ onDestroy() ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ด ๋ฐ์ดํฐ๋ฅผ onCreate()์์ ๋ค์ ๋ถ๋ฌ์ค๋ ํ์์ผ๋ก ์ฌ์ฉํ๋ค.
- ์ฑ์ ์ข ๋ฃํ๊ฑฐ๋ ๋ค๋ฅธ ์กํฐ๋นํฐ๋ก ์ด๋ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค.
2. ScrollView์ GridView๋ก ์๋ ์ด๋ํ๋ ๋ ธ๋ ์ฐ์ตํ๋ฉด ๊ตฌํํ๊ธฐ
์ฐ๋ฆฌ ํ๋ก์ ํธ์์ ์ ์ผ ๋์ด๋๊ฐ ๋์ ๋ ธ๋ ์ฐ์ตํ๋ฉด! ๋ ธ๋๋ฐฉ์ด๋ ๋ ธ๋ ์ฐ์ต ์ฑ์ ๋ณด๋ฉด ์ ๋ณด๊ฐ ์๋์ผ๋ก ์ด๋ํ๋ ํ๋ฉด์ด ์๋ค. ์ฐ๋ฆฌ ํ๋ ๋ ธ๋ ์์ ์ ๋ธ๋ก์ผ๋ก ๋์์ฃผ๊ณ , ๋ ธ๋๊ฐ ์งํ๋จ์ ๋ฐ๋ผ ์๋์ผ๋ก ๋ธ๋ก์ด ์ด๋ํ๋ ํ๋ฉด์ ๊ตฌํํด์ผ ํ๋ค.
์์ ์ ํ์ํ๋๋ฐ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1) GridView์ row, column์ ์๊น์ ๋ฐ๊ฟ cell์ผ๋ก ๋ธ๋ก์ ํ์ํด์ฃผ๋ ๊ฒ
2) Background๋ก GridView๋ฅผ ๊ทธ๋ฆฌ๊ณ , ๊ทธ ์์ ํฌ๋ช ๋๋ฅผ ์กฐ์ ํ Fragment๋ก ๋ธ๋ก์ ํ์ํ๋ ๊ฒ
์ด ์ค์์ ์ฐ๋ฆฌ๋ ๊ตฌํ ๋์ด๋๊ฐ ๋ ๋ฎ์๋ณด์ด๋ 1๋ฒ์ ์ ํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ธ๋๊ฐ ์งํ๋จ์ ๋ฐ๋ผ ํ๋ฉด์ ๋ง์ถฐ์ ์ด๋์์ผ์ค์ผ ํ๋๋ฐ, ์ด๊ฒ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์๋ค.
1) GridView ๋ด์ ์คํฌ๋กค ๊ธฐ๋ฅ ์ด์ฉ
2) ์คํฌ๋กค๋ทฐ ์์ GridView๋ฅผ ๋ฃ์ด์ ์ด๋
๊ทธ๋ฐ๋ฐ ์คํฌ๋กค๋ทฐ์ ์ก์ ์ ๋ฃ๋ ๊ฒ์ด ๋ ์์ฐ์ค๋ฝ๊ฒ ์ด๋์ด ๋๋ ๊ฒ ๊ฐ์ ํ์๋ก ์ ํํ๋ค.
Horizontal ScrollView
์ผ๋จ ์ฐ๋ฆฌ๋ ์ข->์ฐ๋ก ์ด๋ํ๋ ํ๋ฉด์ ๋ง๋ค์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ scrollView๊ฐ ์๋ HorizontalScrollView๋ฅผ ์ ํํ๋ค.
1) ObjectAnimator๋ฅผ ์ด์ฉํ ์๋ ์คํฌ๋กค ์ด๋ฒคํธ ์์ฑ
ObjectAnimator๋?
์๋๋ก์ด๋์์ ์ ๊ณตํ๋ ์ ๋๋ฉ์ด์ ๊ตฌํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ํ๊ฒ์ผ๋ก ์ค์ ํ object์ ์ ๋๋ฉ์ด์ ์ ๋ฃ์ด์ค๋ค.
ObjectAnimator Attribute
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
propertyName | ๊ฐ์ฒด์์ animateํ ์์ฑ์ ์ง์ ํ๋ค. | alpha, rotationX, scrollX, translationX ๋ฑ๋ฑ |
object | ํ๊ฒ object๋ฅผ ์ง์ ํ๋ค | |
valueTo | propertyName์์ ์ง์ ํ ์์ฑ๊ฐ์ ์ข ๋ฃ๊ฐ์ ์ง์ | |
duration | ์ ๋๋ฉ์ด์ ์ง์ ์๊ฐ |
์คํฌ๋กค๋ทฐ๋ฅผ object๋ก ๋๊ณ , X์ถ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋๋ก ์ง์ ํ์์ผ๋ฉฐ, ์ผ๋จ ํ๋ฉด์ ๋๊น์ง ๊ฐ์ผ ํ๋๊น valueTo์ ์์๋ก ํฐ ๊ฐ์ ๋ฃ์ด์ฃผ์๋ค.
์ ๋๋ฉ์ด์ ์ ๋ ธ๋๊ฐ ๋๋ ๋๊น์ง ์ง์๋์ด์ผ ํ๋ฏ๋ก duration์๋ ๋ ธ๋ ๊ธธ์ด๋ฅผ ๋ฃ์ด์ฃผ์๋ค.
scrollView.post(new Runnable() {
@Override
public void run() {
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(scrollView, "scrollX", 1000000);
objectAnimator.setDuration(Math.round(songEndTime)); // song ๊ธธ์ด๋งํผ ์ง์
objectAnimator.start();
}
๊ทธ๋ฌ๋๋ ์ ์๋์ ๋๋๋ฐ...์์๊ณผ ๋์์๋ง ์คํฌ๋กค ์ด๋ ์๋๊ฐ ๋๋ฆฌ๊ณ ์ค๊ฐ์๋ ์์ฒญ๋๊ฒ ๋นจ๋ผ์ง๋ค. ๊ทน์ ์ธ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ์ด ๋์ด์๋ ๋ฏํํ , ์ฐ๋ฆฌ๋ ์ผ์ ํ ์๋๋ก ๋ทฐ๋ฅผ ๋ณด์ฌ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด ํจ๊ณผ๋ฅผ ์์ ์ผ ํ๋ค. ์ด๋ด ๋ Interpolator๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
2) Interpolator๋ฅผ ์ด์ฉํ ์คํฌ๋กค ์๋ ์กฐ์
Interpolator๋?
์ ๋๋ฉ์ด์ ์์ ์ง์ ๊ณผ ์ข ๋ฃ ์ง์ ์ ์ฐ๊ฒฐํ๋ ํจ๊ณผ. (Linear๊ฐ default๋ผ๋๋ฐ ์ ๋ด ์คํฌ๋กค๋ทฐ์์๋ AccelerateDecelerate ํจ๊ณผ๊ฐ ๋ํ๋๋์ง ๋ชจ๋ฅด๊ฒ ๋ค) ์๋ฌดํผ ์ฐ๋ฆฌ๋ LinearInterpolator๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
AccelerateInterpolator | ์์ ์์ ์์ ๊ฐ์ํ๋ค. |
AnticipateInterpolator | ์์์์ ๋ค์ชฝ์ผ๋ก ์ด์ง ์ด๋ํ ์ดํ์ ์ข ๋ฃ์์ ์ ๋์ฐฉํ๋ค. |
OvershootInterpolator | ์ข ๋ฃ์์ ์ ์ง๋์ณ์ ์ด์ง ์ด๋ํ ์ดํ์ ๋ค์ ์ข ๋ฃ์์ ์ผ๋ก ๋์์จ๋ค. |
BounceInterpolator | ์ข ๋ฃ ์์ ์ ๋์ฐฉํ ์ดํ ๋ช ํ์ ๊ฑธ์ณ ํ์ด ์ค๋ฅธ๋ค. |
CycleInterpolator | ์ข ๋ฃ ์์ ์ ๋์ฐฉ ํ ๋ค์ ์์ ์ง์ ์ผ๋ก ์ด๋ํ๋ค. |
DecelerateInterpolator | ์ข ๋ฃ ์ง์ ์ผ๋ก ๋์ฐฉํ ์๋ก ๊ฐ์ํ๋ค. |
LinearInterpolator(default) | ๋์ผํ ์๋๋ก ์์ ์์ ์์ ์ข ๋ฃ ์์ ์ผ๋ก ์ด๋ํ๋ค. |
AccelerateDecelerateInterpolator | ์์ ์ง์ ์์ ๊ฐ์ํ๋ค๊ฐ ์ข ๋ฃ ์์ ์ ๊ฐ์ํ๋ค. |
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ๊ทธ๋ฅ ์ ์ธํด์ฃผ๊ณ ObjectAnimator์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค!
LinearInterpolator interpolator = new LinearInterpolator();
scrollView.post(new Runnable() {
@Override
public void run() {
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(scrollView, "scrollX", 1000000);
objectAnimator.setInterpolator(new LinearInterpolator()); // interpolator ์ค์
objectAnimator.start();
}
});
GridView
์ด์ ์คํฌ๋กค์ด ๋ถ๋๋ฝ๊ฒ ์์ง์ด๋ ๊ฒ์ ํ์ธํ์ผ๋ ๋ฐ์ ๊น์์ค GridView๋ฅผ ๋ง๋ค์ด๋ณด์.
1) GridItem.java
์ผ๋จ ๋ ธํธ์ ์์์ ํ์ํ๋ ์์ดํ ์ ๋ง๋ ๋ค.
@Getter
@AllArgsConstructor
public class ListItem {
String note;
String color;
}
2) GridViewAdapter.java
public class GridListAdapter extends BaseAdapter {
ArrayList<ListItem> items = new ArrayList<ListItem>();
Context context; // ์ดํ๋ฆฌ์ผ์ด์
์ ๋ํ ์ ๋ณด
public void addItem(ListItem item){
items.add(item);
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
context = parent.getContext();
ListItem listItem = items.get(position);
// listItem์ inflateํ์ฌ context๋ฅผ ์ฐธ์กฐ
if (convertView == null){
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.singing_grid_item, parent, false);
}
TextView noteText = convertView.findViewById(R.id.noteText);
TextView colorText = convertView.findViewById(R.id.colorText);
noteText.setText(listItem.getNote());
colorText.setText(listItem.getColor());
return convertView;
}
}
3) GridViewActivity.java
public class SingGridActivity extends AppCompatActivity {
...
private HorizontalScrollView scrollView;
private GridView gridView;
public static FirebaseFirestore database = FirebaseFirestore.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sing_grid);
gridView = findViewById(R.id.gridView);
getSongEndTime();
}
private void setGridViewAdapters(){
int columnNum = (int) Math.round(songEndTime / 0.1);
gridView.setNumColumns(10);
GridListAdapter adapter = new GridListAdapter();
adapter.addItem(new ListItem("B4", "๋นจ๊ฐ"));
adapter.addItem(new ListItem("B4", "์ฃผํฉ"));
adapter.addItem(new ListItem("B4", "๋
ธ๋"));
adapter.addItem(new ListItem("B4", "์ด๋ก"));
adapter.addItem(new ListItem("B4", "ํ๋"));
adapter.addItem(new ListItem("B4", "๋ณด๋ผ"));
adapter.addItem(new ListItem("B4", "๋ถํ"));
adapter.addItem(new ListItem("B4", "๊ฐ์"));
adapter.addItem(new ListItem("B4", "ํ์"));
adapter.addItem(new ListItem("A4", "๋นจ๊ฐ"));
adapter.addItem(new ListItem("A4", "์ฃผํฉ"));
adapter.addItem(new ListItem("A4", "๋
ธ๋"));
adapter.addItem(new ListItem("A4", "์ด๋ก"));
adapter.addItem(new ListItem("A4", "ํ๋"));
adapter.addItem(new ListItem("A4", "๋ณด๋ผ"));
adapter.addItem(new ListItem("A4", "๋ถํ"));
adapter.addItem(new ListItem("A4", "๊ฐ์"));
adapter.addItem(new ListItem("A4", "ํ์"));
gridView.setAdapter(adapter);
}
}
GridView์์๋ ์ฌ์ฉ์๊ฐ ์ ์ํ ์์ดํ ์ ํ์ํ๊ธฐ ์ํด Adapter๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
GridView๋ Adapter๋ก๋ถํฐ ์์ฑ๋ view๋ฅผ ๋ฐ์ GridView ํญ๋ชฉ์ผ๋ก ๋ฐฐ์นํ๋ค.
4) activity_gridview.xml
<?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=".Singing.activity.SingGridActivity">
<HorizontalScrollView
android:id="@+id/horizontalScrollView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="1dp"
android:layout_marginTop="1dp"
android:layout_marginEnd="1dp"
android:layout_marginBottom="1dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<GridView
android:id="@+id/gridView"
android:layout_width="1000dp"
android:layout_height="1000dp"
android:layout_margin="10dp"
android:rowCount="10"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp" />
</LinearLayout>
</HorizontalScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
5) gridview_list_item.xml
<?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">
<LinearLayout
android:layout_width="409dp"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/noteText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:text="์์ "
android:textColor="@android:color/black"/>
<TextView
android:id="@+id/colorText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp"
android:text="์๊น"
android:textColor="@android:color/black" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
๊ทธ๋ฌ๋ฉด ์๋์ฒ๋ผ ์ ๋ํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์คํฌ๋กค๋ ์ ๋๋ค!
์ด์ ๋ ์ด์์์ ๋ค๋ฌ๊ณ cell๋ณ color๋ง ๋ฃ์ด์ฃผ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ ๋ง๋ค ์ ์๋ค.
'๐ฅ ํ๋ก์ ํธ > ์กธ์ ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TarsosDSP] Real-time Pitch Detection (0) | 2021.11.19 |
---|
๋๊ธ