Android 사용자 정의 View 주소록 알파벳 인덱스 구현(위 챗 주소록 모방)
우 리 는 오늘 그림 의 오른쪽 모듈 의 색인 기능 을 실현 합 니 다.터치 디 스 플레이 를 포함 하여 선택 한 색인 자 모 를 표시 합 니 다.여기 서 제 UI 화면 은 주로 위 챗 의 화면 을 참조 하여 이 루어 집 니 다.그래서 여러분 도 위 챗 을 대조 하여 효 과 를 볼 수 있 습 니 다.아무 말 도 하지 않 고 효과 그림 만 이 가장 설득력 이 있 습 니 다!
2.분석:
우 리 는 이런 효 과 를 보고 그 가 어떻게 실현 되 었 는 지 속으로 생각 했다.
우선,이 는 사용자 정의 View 를 통 해 이 루어 질 것 입 니 다.안 드 로 이 드 가 이러한 컨트롤 을 제공 하지 않 았 기 때문에 다음은 우리 의 View 를 어떻게 사용자 정의 하 는 지 알 고 있 습 니 다.사용자 정의 View 의 가장 중요 한 두 가지 방법 은 바로 onDraw(Canvas canvas)와
onMeasure(int widthMeasureSpec,int height MeasureSpec)방법 은 물론 사용자 정의 ViewGroup 이 라면 반드시 이 루어 져 야 합 니 다.
onLayout(boolean changed,int left,int top,int right,int bottom)방법 은 사용자 정의 View 로 이 기능 을 실현 할 수 있 음 이 분명 합 니 다.효과 도 를 통 해 테 이 프 를 볼 수 있 습 니 다.이 영역 을 만 질 때 Toast 와 유사 한 상자 가 떠 서 선택 한 색인 내용 을 표시 합 니 다.그래서 View 의 onTouchEvent(MotionEvent event)이 벤트 를 다시 써 야 합 니 다.마지막 으로 부상 상자 의 실현 입 니 다.그럼 지금부터 인 코딩 을 시작 하 겠 습 니 다.
3.인 코딩 실현:
저 희 는 뷰 의 집행 순서에 따라 이 루어 집 니 다.
1.onMeasure(int widthMeasureSpec,int height MeasureSpec)방법 을 실현 합 니 다.이 방법의 기능 은 우리 의 너비 와 높이 를 측정 하고 코드 를 구체 적 으로 실현 하 는 것 입 니 다.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
}
여기 서 두 가지 방법 으로 measureWidth(int)와 measureHeight(int)를 정 의 했 습 니 다.방법 명 을 통 해 그 기능 이 각각 너비 와 높이 를 측정 하 는 것 임 을 잘 알 수 있 습 니 다.들 어가 서 어떻게 측정 하 는 지 보 세 요.
/**
* ,
* @param widthMeaSpec View
* @return
*/
private int measureWidth(int widthMeaSpec){
/* view */
int width ;
/* View */
int mode = MeasureSpec.getMode(widthMeaSpec) ;
/*
* View , ,
*
* */
int size = MeasureSpec.getSize(widthMeaSpec) ;
/*
* ,
* View ,
* size ;
* */
if(mode == MeasureSpec.EXACTLY){
width = size ;
}else {
/* padding */
int desire = size + getPaddingLeft() + getPaddingRight() ;
if(mode == MeasureSpec.AT_MOST){
width = Math.min(desire,size) ;
}else {
width = desire ;
}
}
mViewWidth = width ;
return width ;
}
이상 은 폭 을 측정 하 는 코드 입 니 다.높이 를 측정 하 는 코드 는 폭 을 측정 하 는 코드 와 대체적으로 비슷 해서 붙 이지 않 습 니 다.마지막 에 소스 코드 를 첨부 하 겠 습 니 다.2.onDraw(Canvas c)방법 을 실현 합 니 다.이 방법 은 모두 가 잘 알 고 있다 고 믿 습 니 다.바로 이 색인 들 의 내용 을 View 에 그 려 서 선택 할 때 배경 색 의 변 화 를 포함 합 니 다.
@Override
protected void onDraw(Canvas canvas) {
if(mTouched){
canvas.drawColor(0x30000000);
}
for (int i = 0 ; i < mIndex.length ; i ++){
mPaint.setColor(0xff000000);
mPaint.setTextSize(mTextSize * 3.0f / 4.0f);
mPaint.setTypeface(Typeface.DEFAULT) ;
mPaint.getTextBounds(mIndex[i],0,mIndex[i].length(),mTextBound);
float formX = mViewWidth/2.0f - mTextBound.width()/2.0f ;
float formY = mTextSize*i + mTextSize/2.0f + mTextBound.height()/2.0f ;
canvas.drawText(mIndex[i],formX,formY,mPaint);
mPaint.reset();
}
}
제 가 onDraw 방법 에서 대체적으로 무슨 일 을 했 는 지 말씀 드 리 겠 습 니 다.첫째,배경 색 을 그립 니 다.올 라 오 자마자 그 리 는 것 이 아니 라 손가락 이 만 질 때 배경 색 을 그립 니 다.둘째,색인 내용 을 그립 니 다.여 기 는 현재 View 의 너비 와 높이 에 따라 내용 의 크기 와 위 치 를 결정 해 야 합 니 다.3.onTouchEvent(MotionEvent event)방법의 실현
@Override
public boolean onTouchEvent(MotionEvent event) {
float y = event.getY() ;
int index = (int) (y / mTextSize);
if(index >= 0 && index < mIndex.length){
Log.v("zgy","======index======="+index) ;
selectItem(index);
}
if(event.getAction() == MotionEvent.ACTION_MOVE){
mTouched = true ;
}else if (event.getAction() == MotionEvent.ACTION_MOVE){
}else {
mFloatView.setVisibility(INVISIBLE);
mTouched = false ;
}
invalidate();
/* */
return true;
}
코드 도 상대 적 으로 간단 합 니 다.먼저 현재 터치 점 을 얻 고 점 의 좌표 에 따라 색인 의 위 치 를 얻 으 며 색인 의 위 치 를 얻 습 니 다.4.여기까지 사실은 우리 가 원 하 는 효 과 를 실현 했다.그러나 이렇게 해서 우 리 는 그것 을 활용 할 수 없다.여기 서 반전 인 터 페 이 스 를 정의 해 야 한다.
/* */
public interface OnIndexSelectListener{
/* , */
void onItemSelect(int position, String value) ;
}
인 터 페 이 스 를 우리 가 어디 에 두 고 호출 할 까요?우리 가 손가락 을 눌 렀 을 때 이 럴 때 우 리 는 우리 가 누 른 색인 이 어떤 색인 인지 확인 해 야 합 니 다.미 끄 러 질 때 도 마찬가지 입 니 다.그래서 이것 은 상의 할 것 이 없 이 onTouchEvent(MotionEvent event)에 직접 넣 으 면 됩 니 다.
float y = event.getY() ;
int index = (int) (y / mTextSize);
if(index >= 0 && index < mIndex.length){
Log.v("zgy","======index======="+index) ;
selectItem(index);
}
selectitem(int)방법 중 실행 되 는 리 셋 방법 입 니 다.5.선택 한 색인 내용 을 보 여 주 는 부유 상자 구현
Window Manager 용 기 를 사용 해 야 합 니 다.현실 적 인 View 가 이 위 에 붙 어 있 으 면 됩 니 다.손가락 을 눌 렀 을 때 View 가 표시 되도록 하고 표시 하지 않 으 면 됩 니 다.
/* */
/* windowManager*/
mWindowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
/*overly , LayoutInflater */
mFloatView = LayoutInflater.from(getContext()).inflate(R.layout.overlay_indexview,null) ;
/* */
mFloatView.setVisibility(INVISIBLE);
/* Sp*/
mOverlyWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,70,getResources().getDisplayMetrics()) ;
mOverlyHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,70,getResources().getDisplayMetrics()) ;
post(new Runnable() {
@Override
public void run() {
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(mOverlyWidth,mOverlyHeight,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT) ;
mWindowManager.addView(mFloatView,layoutParams);
}
}) ;
마찬가지 로 표 시 된 내용 을 바 꾸 려 면 리 셋 위 치 를 호출 하여 View 의 TextView 에 현재 색인 내용 을 설정 해 야 합 니 다.자,이 View 의 코드 가 이렇게 많 습 니 다.
다음은 그의 Xml 와 부동 View 를 인용 한 Xml 도 붙 이 고,
인 용 된 레이아웃 파일
<moon.wechat.view.IndexView
android:layout_width="25dp"
android:layout_height="match_parent"
android:layout_alignParentRight="true"/>
부동 View 의 레이아웃 파일
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/overly_text"
android:layout_width="70dp"
android:layout_height="70dp"
android:text="A"
android:gravity="center"
android:background="@drawable/bg_overly_text"
android:textSize="40sp"
android:textColor="#ffffffff"
android:layout_gravity="center">
</TextView>
부동 뷰 배경
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#88000000"/>
<corners android:radius="5dp"/>
</shape>
</item>
</layer-list>
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.