나는 아래 이미지를 다 만들어야 하는 줄 알았다. 해상도별로 아이콘을 만들어야 하는 줄 알았다. 그런데 아니었고 가운데 들어갈 이미지만 필요한 거 였다.
앱을 어느정도 정리하고 아이콘 변경을 하러왔다.
1. 아이콘 이미지 준비한다. 나는 회사 이미지를 사용하지 않으니 대체 이미지를 만들었다.
참고 : 배경 없는 아이콘을 만들면 배경색도 마음대로 조절할 수 있고 크기도 더 정교하게 맞출 수 있다.
res > New > Image Asset를 선택한다.
2. Foreground Layer 에서 Path를 변경하여 아이콘으로 쓸 이미지를 불러온다. 불러오면 아래처럼 Preview에 미리보여주는데 각 아이콘에 맞게 Resize를 변경하여 맞춘다.
3. Background Layer 에서 배경색을 변경한다. 위에 사진을 보면 Full Bleed Layers가 바탕색이 보인다. 그리고 이미지가 조금 작거나 크게 되면 자기 배경색이 아이콘과 조금 안 맞을 때가 있다. 그렇기 때문에 여기서 배경색을 아이콘 이미지 배경색과 맞춰주거나 아이콘의 배경색을 없애고 가져왔다면 여기서 원래 하려했던 배경색을 세팅을 해준다. 아래 이미지를 참고하자.
4. 이미지를 프로젝트에 불러왔다면 이젠 프로젝트에 적용을 시켜줘야한다.
Manifests > application > icon , roundIcon을 자신이 추가 했던 Name으로 변경한다.
package com.saii.viewpager2_guide;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
class ViewPagerAdapter extends FragmentStateAdapter {
public int mCount;
public ViewPagerAdapter(FragmentActivity fa, int count) {
super(fa);
mCount = count;
}
public Fragment createFragment(int position) {
int index = getRealPosition(position);
if(index==0) return new GuideFragment1();
else if(index==1) return new GuideFragment2();
else return new AdFragment1();
}
@Override
public int getItemCount() {
return 3;
}
public int getRealPosition(int position) { return position % mCount; }
}
4. MainActivity.java에서 ViewPager와 Adapter를 연결해준다.
MainActivity.java
package com.saii.viewpager2_guide;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private ViewPager2 mPager;
private FragmentStateAdapter pagerAdapter;
private final int num_page = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPager = findViewById(R.id.vp_guide);
pagerAdapter = new ViewPagerAdapter(this, num_page);
mPager.setAdapter(pagerAdapter);
mPager.setCurrentItem(1); //시작 지점
mPager.setOffscreenPageLimit(num_page); //최대 페이지 수
mPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
if (positionOffsetPixels == 0) {
mPager.setCurrentItem(position);
}
}
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
}
});
}
}
5. 각 Fragment에 이벤트를 정의합니다. Fragment에는 메인 화면으로 갈 수 있는 이벤트를 코딩했습니다. 클릭 이벤트를 커스텀 하고 싶다면 onClick 안에 다른 코딩을 하시면 됩니다. 간혹 Fragment에서 뷰가 인식이 안된다는 사람이 있는데 그 부분은 나중에 Fragment를 참조하면 될 것 같다.