Android 는 생방송 채 팅 영역 상단 의 그 라 데 이 션 효 과 를 실현 합 니 다.
4 월 에 생방송 을 개발 할 때 한 가지 수요 가 있 는데 RecylerView 상단 의 그 라 데 이 션 효 과 를 실현 해 야 한다.
실제 효과
해결 방향
그래 픽 중첩 처리(본질은 알파 중첩 효과)
실현 절차
그림 을 저장 한 다음 에 그 라 데 이 션 을 그리고 마지막 에 원래 의 그림 과 합 쳐 이 효 과 를 얻 습 니 다.
관련 지식(모 르 는 것 은 google):
* 주로 RecyclerView 의 ItemDecoration 류 를 통 해 해결 된다.
* Paint,Canvas,Shader,Xfermode(그림 융합)
* 그 라 디 언 트(그 라 데 이 션)
자세 한 과정:
그림 층 의 중첩 은 Xfermode 를 통 해 이 루어 져 야 합 니 다.Xfermode 는 주로 서로 다른 그림 층 을 융합 시 켜 야 합 니 다.그러나 전 제 는 서로 다른 그림 층 이 같은 붓(Paint)으로 그 려 야 한 다 는 것 입 니 다.여기에 몇 가지 문 제 를 던 졌 다.
1. 어떻게 RecyclerView 의 모든 Item 의 그림 을 가 져 옵 니까?
2. 그림 층 을 가 져 옵 니 다.어떻게 이 그림 층 의 붓 과 그 라 데 이 션 그림 층 의 붓 을 일치 시 킵 니까?
3. 융합 방식,Xfermode 의 인 자 를 참조 하 시 겠 습 니까?
해결 방안
1. 자 료 를 찾 으 면 RecyclerView 의 ItemDecoration 추상 류 를 통 해 알 수 있 고 그림 의 앞 뒤 이 벤트 를 그 릴 수 있 습 니 다.onDraw:Item 이 시작 한 이벤트 리 셋 을 그립 니 다.onDrawOver:Item 이 끝 난 이벤트 리 셋 을 그립 니 다.Parent 계산 을 통 해 해당 아 이 템 이나 Canvas 패 널 을 가 져 올 수 있 습 니 다.
2. Canvas 의 saveLayer 방법 은 현재 Canvas 를 Paint 에 저장 한 다음 이 Paint 로 그 라 데 이 션 그래 픽 을 그리 면 두 개의 그래 픽 이 같은 붓 을 그 리 는 조건 을 실현 합 니 다.
3. 융합 방식,DST 사용IN,하단 층 은 채 팅 아 이 템,상층 부 는 그 라 데 이 션 아 이 템,알파 가 융합 되면 채 팅 아 이 템 이 그 라 데 이 션 효 과 를 낸다.(머 릿 결
구체 적 인 코드:
public void doTopGradualEffect(){
if(recyclerView == null){
return ;
}
mPaint = new Paint();
//
final Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
mPaint.setXfermode(xfermode);
// ,
linearGradient = new LinearGradient(0.0f, 0.0f, 0.0f, 100.0f, new int[]{0, Color.BLACK}, null, Shader.TileMode.CLAMP);
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
// RecyclerView, ,
@Override
public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(canvas, parent, state);
mPaint.setXfermode(xfermode);
mPaint.setShader(linearGradient);
canvas.drawRect(0.0f, 0.0f, parent.getRight(), 200.0f, mPaint);
mPaint.setXfermode(null);
canvas.restoreToCount(layerId);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
layerId = c.saveLayer(0.0f, 0.0f, (float) parent.getWidth(), (float) parent.getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
}
});
}
데모 이미 github 업로드:https://github.com/HarrisonLin/RecyclerViewEffectGather관심 있 는 것 은 다운로드 할 수 있 습 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.