Android 모방 위 챗 5.2.1 메 인 인터페이스 및 메시지 알림

오 랜 만 에 블 로 그 를 업 데 이 트 했 습 니 다.최근 에 회사 프로젝트 를 하고 있 습 니 다.이것 도 제 가 접촉 한 첫 번 째 정식 프로젝트 라 고 할 수 있 습 니 다.프로젝트 검 사 를 통 해 자신 이 1 년 동안 쌓 은 지식 이 아직도 부족 하 다 는 것 을 알 게 되 었 습 니 다.향상 시 키 려 면 좋 은 방법 은 프로젝트+책+동 영상+블 로그 입 니 다.가장 중요 한 것 은 부지런히 하 는 것 이다.최근 에 모 과 망 의 동 영상 을 발 견 했 는데 모두 고 화질 무료 라 니!그리고 건어물 이 가득!저 는 여가 시간 에 영상 속 의 신 들 의 설명 을 따라 많은 지식 을 배 웠 습 니 다.다음은 이런 작은 demo 를 여러분 과 공유 하 겠 습 니 다.물론 저 는 최 적 화 를 했 습 니 다.코드 와 영상 에서 차이 가 있 지만 기능 은 완전히 실현 할 수 있 습 니 다.
이것 은 5.2.1 버 전 을 모방 한 디 스 플레이 인터페이스 입 니 다.다음 그림 과 같 습 니 다.
这里写图片描述 这里写图片描述
기능 및 실현 사고 안내
주요 기능 은 매우 간단 하 다.
1.위 에 사용자 정의 제목 표시 줄 이 있 습 니 다.
2.아래 는 채 팅,발견,주소록 옵션 입 니 다.
3.손가락 이 미 끄 러 질 때 텍스트 아래 파란색 indicator 는 미 끄 러 질 수 있 습 니 다.
4.채 팅 의 오른쪽 에 읽 지 않 은 메시지 의 빨간색 알림 원점 이 있 습 니 다.
사용자 정의 제목 표시 줄 은 LinearLayout 이 며 시스템 이 자체 적 으로 가지 고 있 는 TitleBar(또는 Action Bar)를 숨 깁 니 다.
옵션 이기 때문에 자 연 스 럽 게 Fragment 가 생각 났 습 니 다.
손가락 이 미 끄 러 질 수 있 습 니 다.검은색 구역 은 ViewPager 입 니 다.데이터 원본 은 Fragment 로 구 성 된 집합 이 고 Fragment Pager Adapter 를 통 해 관리 합 니 다.
파란색 인디케이터 가 옵션 카드 의 미끄럼 에 따라 미 끄 러 지 려 면 ViewPager 에 감청 을 설정 하고 리 셋 방법의 리 셋 값 에 따라 이 인디케이터 의 margin Left 속성 값 을 제어 하면 이 효 과 를 실현 할 수 있 습 니 다.
마지막 메시지 알림 의 작은 원점 은 BadgeView 입 니 다.제3자 오픈 소스 컨트롤 입 니 다.
주 레이아웃
MainActivity 레이아웃 은 다음 과 같 습 니 다.먼저 사용자 정의 TitleBar 입 니 다.

<!-- top1.xml -->

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="match_parent"
 android:layout_height="50dp"
 android:background="@drawable/topone_bg"
 android:paddingLeft="12dp"
 android:paddingRight="12dp">

 <LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_centerVertical="true"
  android:gravity="center"
  android:orientation="horizontal">

  <ImageView
   android:layout_width="30dp"
   android:layout_height="30dp"
   android:background="@drawable/actionbar_icon" />

  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_marginLeft="12dp"
   android:text="  "
   android:textColor="#D3D3D3"
   android:textSize="18sp" />
 </LinearLayout>

 <LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_centerVertical="true"
  android:orientation="horizontal">


  <ImageView
   android:layout_width="30dp"
   android:layout_height="30dp"
   android:background="@drawable/actionbar_search_icon" />

  <ImageView
   android:layout_width="30dp"
   android:layout_height="30dp"
   android:background="@drawable/actionbar_add_icon" />

  <ImageView
   android:layout_width="30dp"
   android:layout_height="30dp"
   android:background="@drawable/actionbar_more_icon" />


 </LinearLayout>


</RelativeLayout>

효 과 는 다음 과 같다.

다음은 세 개의 옵션 카드 의 레이아웃 입 니 다.

<!-- top2.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:background="#EEEEEE"
 android:orientation="vertical">

 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="37dp"
  android:orientation="horizontal">

  <LinearLayout
   android:id="@+id/ll_chat"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:gravity="center"
   android:orientation="horizontal">

   <TextView
    android:id="@+id/tv_tab_chat"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:layout_gravity="center"
    android:text="  "
    android:textColor="#008000"
    android:textSize="16sp" />


  </LinearLayout>

  <LinearLayout
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:gravity="center">

   <TextView
    android:id="@+id/tv_tab_discover"
    android:layout_width="wrap_content"

    android:layout_height="wrap_content"
    android:text="  "
    android:textColor="@android:color/black"
    android:textSize="16sp" />


  </LinearLayout>

  <LinearLayout
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:gravity="center">

   <TextView
    android:id="@+id/tv_tab_contacts"

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="   "
    android:textColor="@android:color/black"
    android:textSize="16sp" />


  </LinearLayout>

 </LinearLayout>

 <ImageView
  android:id="@+id/iv_tab_line"
  android:layout_width="100dp"
  android:layout_height="3dp"
  android:background="@drawable/tabline" />

</LinearLayout>

효 과 는 다음 과 같 습 니 다:

Indicator 는 코드 에 길 이 를 동적 으로 설정 해 야 하기 때문에 xml 에 임의의 값 을 추가 할 수 있 습 니 다.
마지막 으로 top 1.xml,top 2.xml 을 주 레이아웃 에 추가 하고 주 레이아웃 에 ViewPager 를 도입 합 니 다.

<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="com.demo.lenovo.myapplication.MainActivity">

 <include layout="@layout/top1" />

 <include layout="@layout/top2" />

 <android.support.v4.view.ViewPager
  android:id="@+id/vp_content"
  android:layout_width="match_parent"
  android:layout_height="0dp"
  android:layout_weight="1" />
</LinearLayout>


효 과 는 다음 과 같 습 니 다:

주:Activity 가 Action BarActivity 에 계승 되면 setContentView()방법 전에requestWindowFeature(Window.FEATURE_NO_TITLE);제목 표시 줄 을 숨 길 수 있 습 니 다.AppCompact Activity 에 계승 하면 AndroidMainfest 에서
응용 프로그램 탭 에 테 마 를 설정 하면android:theme="@style/Theme.AppCompat.NoActionBar"제목 표시 줄 을 숨 기 는 목적 도 실현 할 수 있 습 니 다.
Fragment Pager Adapter 를 사용 하여 ViewPager 에 적합 한 데 이 터 를 만 듭 니 다.
MainActivity.java 에 Fragment PagerAdapter 논 리 를 추가 합 니 다.(여기 서 세 개의 Fragment 레이아웃 과 코드 를 생략 합 니 다)

 private FragmentPagerAdapter adapter;
 private List<Fragment> mData;

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    initView();

initView()에서 Fragment 를 초기 화하 고 Fragment 인 스 턴 스 를 List 에 한 번 불 러 온 다음 Fragment PagerAdapter 를 초기 화 할 때 List 의 데 이 터 를 관리 합 니 다.마지막 으로 ViewPager 의 setAdapter 방법 을 호출 하여 Fragment Pager Adapter 인 스 턴 스 를 전송 합 니 다.

 mData = new ArrayList<>();
    mData.add(new ChatFragment());
    mData.add(new DiscoverFragment());
    mData.add(new ContactsFragment());
    adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
      @Override
      public Fragment getItem(int position) {
        return mData.get(position);
      }

      @Override
      public int getCount() {
        return mData.size();
      }
    };
    vp_content.setAdapter(adapter);

미 끄 러 질 때 글꼴 색상 변 화 를 설정 합 니 다.
이 기능 을 구현 하기 위해 서 는 ViewPager 에 setOnPageChangeListener 감청 을 설정 하고 OnPageChangeListener 인터페이스의 리 셋 방법 인 onPagerSelected(int position)를 통 해 현재 몇 페이지 로 미 끄 러 졌 는 지 감청 해 야 합 니 다.

@Override
      public void onPageSelected(int position) {
        Log.e(TAG, "onPageSelected: " + position);
        resetTextViewColor();
        switch (position) {
          case 0:       
          addBadgeView();  tv_tab_chat.setTextColor(Color.parseColor("#008000"));
            break;

          case 1:
            tv_tab_discover.setTextColor(Color.parseColor("#008000"));
            break;

          case 2:
            tv_tab_contacts.setTextColor(Color.parseColor("#008000"));
            break;
        }

      }

//                 
 private void resetTextViewColor() {
    tv_tab_contacts.setTextColor(Color.BLACK);
    tv_tab_chat.setTextColor(Color.BLACK);
    tv_tab_discover.setTextColor(Color.BLACK);

BadgeView 추가
addBadgeView()에서;방법 에서 먼저 BadgeView 가 비어 있 는 지 여 부 를 판단 하고 비어 있 지 않 으 면 먼저 제거 한 다음 에 새로운 BadgeView 를 추가 합 니 다.코드 는 다음 과 같 습 니 다.

 private void addBadgeView()
 {
 if (mBadgeView != null) {
              ll_chat.removeView(mBadgeView);
            }
            mBadgeView = new BadgeView(MainActivity.this);
            ll_chat.addView(mBadgeView);
            mBadgeView.setBadgeCount(9);


}

미 끄 러 질 때 글꼴 색상 변 화 를 설정 합 니 다.
이 기능 을 구현 하기 위해 서 는 ViewPager 에 setOnPageChangeListener 감청 을 설정 하고 OnPageChangeListener 인터페이스의 리 셋 방법 인 onPagerSelected(int position)를 통 해 현재 몇 페이지 로 미 끄 러 졌 는 지 감청 해 야 합 니 다.

@Override
      public void onPageSelected(int position) {
        Log.e(TAG, "onPageSelected: " + position);
        resetTextViewColor();
        switch (position) {
          case 0:       
          addBadgeView();  tv_tab_chat.setTextColor(Color.parseColor("#008000"));
            break;

          case 1:
            tv_tab_discover.setTextColor(Color.parseColor("#008000"));
            break;

          case 2:
            tv_tab_contacts.setTextColor(Color.parseColor("#008000"));
            break;
        }

      }

//                 
 private void resetTextViewColor() {
    tv_tab_contacts.setTextColor(Color.BLACK);
    tv_tab_chat.setTextColor(Color.BLACK);
    tv_tab_discover.setTextColor(Color.BLACK);

BadgeView 추가
addBadgeView()에서;방법 에서 먼저 BadgeView 가 비어 있 는 지 여 부 를 판단 하고 비어 있 지 않 으 면 먼저 제거 한 다음 에 새로운 BadgeView 를 추가 합 니 다.코드 는 다음 과 같 습 니 다.

 private void addBadgeView()
 {
 if (mBadgeView != null) {
              ll_chat.removeView(mBadgeView);
            }
            mBadgeView = new BadgeView(MainActivity.this);
            ll_chat.addView(mBadgeView);
            mBadgeView.setBadgeCount(9);


}

인디케이터 의 미끄럼
이 Indicator 가 손가락 이 미 끄 러 지 는 데 따 른 효 과 를 실현 하기 위해 서 는 OnPageChangeListener 인터페이스 에 있 는 onPageScrolled()방법 에서 논 리 를 작성 해 야 합 니 다.이 방법의 문 서 는 다음 과 같 습 니 다.
这里写图片描述
그 중에서 첫 번 째 매개 변수 position 은 몇 페이지 까지 미 끄 러 졌 다 는 것 을 나타 낸다.예 를 들 어 0 페이지 에서 첫 페이지 로 미 끄 러 지면 position 은 0 이 되 고 손 을 놓 은 후에 첫 페이지 로 미 끄 러 지면 position 은 1 이 되 며 두 번 째 매개 변수 position Offset 은 미 끄 러 지 는 백분율 을 나타 내 고 수치 범 위 는 0-1 이 며 마지막 매개 변수 position Offset Pixels 는 미 끄 러 지 는 픽 셀 수 를 나타 낸다.
다음은 0->1 페이지 에서 인쇄 한 log 입 니 다.다음 과 같 습 니 다.
这里写图片描述
1->2 페이지 에서 인쇄 한 log:
这里写图片描述
2->1 페이지 에서 인쇄 한 log:
这里写图片描述
마지막 으로(position+position Offset)*1/3 에 따라 이 Indicator 의 margin Left 를 설정 할 수 있 습 니 다.
우선,Indicator 에 폭 을 설정 해 야 합 니 다.그 폭 은 화면 너비 의 1/3 입 니 다.

 WindowManager manager = getWindow().getWindowManager();
    Display display = manager.getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics();
    display.getMetrics(outMetrics);
    mScreenOneThird = outMetrics.widthPixels / 3;

그 중에서 int 형 매개 변수 mScreenOne Third 의 단 위 는 픽 셀 px 입 니 다.
Indicator 에 설정:

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) iv_tab_line.getLayoutParams();
    lp.width = mScreenOneThird;
    iv_tab_line.setLayoutParams(lp);

마지막 으로 onPageScrolled 방법 에서 Indicator 의 margin Left 속성 을 동적 으로 변경 합 니 다.

@Override
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) iv_tab_line.getLayoutParams();
        lp.leftMargin = (int) ((positionOffset * mScreenOneThird) + (mScreenOneThird * position));
        iv_tab_line.setLayoutParams(lp);

최종 효 과 를 실현 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기