Android 는 광고 효과 실현 코드 를 알 고 있 습 니 다.
먼저 효과 보기:
view 를 사용자 정의 해 야 합 니 다.imageView 와 같은 컨트롤 러 는 광고 이미지 의 표시 위 치 를 지정 하 는 값 을 주어 야 합 니 다.
질문:
1.그림 이 어떻게 범위 내(단일 item 범위)에서 상하 로 이동 하 는 지,예 를 들 어 창문 처럼 뒤의 그림 은 움 직 일 수 있 지만 창문 은 고정 되 어 있다.
2.그림 이 이동 하 는 시 기 는 분명 recycle View 스크롤 감청 item 과 관련 이 있 을 것 입 니 다.어떤 방법 을 사용 하 시 겠 습 니까?
해결:
1.창문 문 제 는 먼저 imageView 의 scale Type 속성 을 생각 합 니 다.scale Type 에 서 는 matrix 와 center 만 그림 의 크기 를 조정 하지 않 고 큰 그림 의 부분 을 표시 할 수 있 습 니 다.center 는 그림 중간 부분 에 항상 표시 되 며 요구 에 부합 되 지 않 습 니 다.matrix 는 표시 위 치 를 지정 하지 않 습 니 다.
2.recycle View Item 의 스크롤 감청 은 얼마 전에 마이크로 블 로그 영상 을 모방 하여 자동 으로 재생 할 때 접촉 한 적 이 있 습 니 다.recycle View 는 FindFirst Visible Item Position(현재 화면 첫 번 째 item 의 position),FindFirst Complete ly Visible ItemPosition(현재 화면 첫 번 째 로 item 의 position 을 완전히 표시 하 는 방법)등 방법 을 제공 하여 이런 방법 을 이용 할 수 있 습 니 다.현재 아 이 템 을 찾 아 인 스 턴 트 of 키 워드 를 이용 하여 현재 아 이 템 이 제 광고 아 이 템 인지 아 닌 지 비교 합 니 다.광고 사진 을 움 직 일 방법 을 다시 생각해 보 세 요.
단계:
1.광고 이미지 뷰 를 사용자 정의 하여 그 를 창문 으로 만든다.
imageView 를 계승 하려 면 그의 두 가지 방법,onSizeChanged 와 onDraw 를 다시 써 야 합 니 다.
onSizeChanged 는 컨트롤 높이 를 얻 는 데 사 용 됩 니 다.
onDraw 모 바 일 광고 이미지
int itemHeight = 0; // imageView
private float rate = 1; //
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
itemHeight = h; // item
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
int w = getWidth();
int h = (int) (getWidth() * 1.0f / drawable.getIntrinsicWidth() * drawable.getIntrinsicHeight());
drawable.setBounds(0, 0, w, h);//
int maxDy = h - itemHeight; // ( ): (0 ~ -maxDy)
canvas.save();
canvas.translate(0, -rate * maxDy);
super.onDraw(canvas);
canvas.restore();
}
public void setDy(int itemDy, int rvheight) {
int allHeight = rvheight - itemHeight; // ( )
rate = itemDy * 1f / allHeight;
if (rate <= 0) {
rate = 0;
}
if (rate >= 1) {
rate = 1;
}
invalidate();
}
setDy 방법 은 상관 하지 않 아 도 됩 니 다.onDraw 에서 몇 가지 점 을 말 합 니 다.
슈퍼.onDraw(canvas)코드 의 위치
슈퍼.onDraw(canvas)는 원래 imageView 논 리 를 실현 하 는 곳 으로 사용자 정의 view 그리 기 선후 문제 와 관련된다.만약 에 제 가 canvas 로 원 을 그 렸 다 면 원 코드 를 슈퍼 에 쓰기 전에 쓰 겠 습 니 다.이 원 은 먼저 그 려 지고 슈퍼 에 가면 imageView 가 원 을 가 리 는 상황 이 발생 할 것 입 니 다.원 코드 를 슈퍼 뒤에 쓰 겠 습 니 다.
먼저 슈퍼 에 원 을 그리고 원 은 이미지 뷰 위 에 있 습 니 다.위의 코드 에 있 는 슈퍼 위 치 를 참고 하여 먼저 그림 의 위 치 를 canvas.translate 방법 으로 이동 한 다음 에 슈퍼 의 원래 논 리 를 이용 하여 그림 을 그리 면 그림 이 창 에서 이동 하 는 효 과 를 실현 합 니 다.(이 설명 은 기 존의 이미지 뷰,textview 등 을 계승 하 는 것 에 만 적용 되 며,뷰 를 계승 하 는 것 이 라면 슈퍼 위 치 는 매우 자 유 롭 습 니 다.슈퍼 는 빈 공간 이기 때 문 입 니 다)
drawable.setBounds(l,t,r,b)방법
이 방법 은 그림 에 절대 위치 범 위 를 설정 합 니 다~(또는 상대 화면의 표시 범위)~,위 코드 의 범위 계산~(매개 변수 r,b)~사실은 전체 화면 이 상태 표시 줄 내 비게 이 션 표시 줄 을 제외 한 범위 입 니 다~(recycleView 의 범위)~int w=getWidth()는 그림 이 표시 할 수 있 는 최대 폭 을 계산 한 다음 최대 너비/그림 원래 너비=최대 높이/그림 원래 높이 를 통 해 최대 높이 h 를 계산 합 니 다.바로 int h=.
onDraw 방법 을 통 해 이미 실현 할 수 있 습 니 다.하나의 imageView 컨트롤 로 내부 그림 을 동적 으로 이동 할 수 있 습 니 다.이 사용자 정의 imageView 는 완 성 된 셈 입 니 다.
2.recycle View 감청 및 위치 계산 가 져 오기
감청 을 쓰기 전에 recycle View 의 item 을 사용자 정의 imageView 와 연결 시 키 는 방법 을 생각해 보 세 요.
canvas.translate(dx,dy)
을 통 해 그림 을 움 직 여야 합 니 다.dy 를 요구 해 야 합 니 다.효 과 를 볼 수 있 습 니 다.광고 아 이 템 이 화면 에 조금 만 없 으 면 그 중의 그림 은 이동 하지 않 습 니 다.그러면 우리 광고 아 이 템 의 효과 적 인 이동 거 리 는 전체 recycle View 의 높이 에서 광고 아 이 템 의 높이 를 줄 이 는 것 입 니 다.그림 녹색 선 참조:
그리고 저 희 는 imageView 에서 그림 의 효과 적 인 이동 거 리 는 전체 그림 의 높이 에서 창의 높이 를 줄 이 는 것 입 니 다.그림 녹색 선:(빨간색 상 자 는 사용자 정의 imageView 창 에 해당 하고 전체 그림 은 창 뒤에 번역 할 수 있 는 그림 입 니 다)
관계 가 나 왔 습 니 다:광고 item 위치/광고 유효 이동 거리=dy/이미지 유효 이동 거리
다시 쓰기
RecyclerView.OnScrollListener
중의onScrolled
방법 을 얻 으 려 면 광고 item 위치 와 광고의 효과 적 인 이동 거리
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int first = layoutManager.findFirstCompletelyVisibleItemPosition(); // item
int last = layoutManager.findLastCompletelyVisibleItemPosition(); // item
int firstPosition = layoutManager.findFirstVisibleItemPosition(); // item
int lastPosition = layoutManager.findLastVisibleItemPosition(); // item
// item
for (int i = firstPosition; i <= lastPosition; i++) {
RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(i);
// item
if (viewHolder instanceof TxRecycleAdapter.ZhiHuHolder) {
TxRecycleAdapter.ZhiHuHolder zhiHuHolder = (TxRecycleAdapter.ZhiHuHolder) viewHolder;
View itemView = zhiHuHolder.itemView;
// item (item recycleView )
int top = itemView.getTop();
// recycleView
int height = recyclerView.getHeight();
// imageView ,
zhiHuHolder.adImageView.setDy(top, height);
}
}
}
int top = itemView.getTop(); top = item ;
광고의 유효한 이동 거리=recycleView 의 높이-광고 item 의 높이 는 사용자 정의 이미지 View 의 setDy 방법 에 놓 여 있다.주의 방법 중 for 순환
for (int i = firstPosition; i <= lastPosition; i++) {}
rate 는 1 그림 이 상단 에 딱 표 시 됩 니 다.rate 는 0 그림 이 아래쪽 에 딱 표 시 됩 니 다.
rate 0~1:
미끄럼 느 린 rate 는 이렇게 변화 할 수 있 습 니 다.0.05,0.10,0.15,0.20...,0.80,0.85,0.90,0.95,1.0.
미끄럼 속도 가 이렇게 변 할 수 있 습 니 다:0.3,0.6,0.9.
근본적으로 1 이나 0 과 같 지 않 을 것 이다.그 그림 의 translate 위 치 는 틀림없이 틀 릴 것 이다.
이 문제 가 발생 하면 저 는 속도 추적 류(Velocity Tracker)가 속 도 를 계산 하고 속도 가 크 면 미끄럼 방향 에 따라 직접 지붕 을 치 거나 바닥 을 치 거나 광고 아 이 템 의 보이 기 쉬 운 지붕 을 치 거나 바닥 을 치 는 등 여러 가지 방법 을 시도 해 봤 습 니 다.어떤 방법 은 좀 쓸 수 있 지만 너무 번 거 로 워 요.마지막 으로 for 순환 에서 firstPosition 과 lastPosition 을 사용 하면 rate=-0.2 와 같은 마이너스 가 나 올 수 있 지만 판단 만 해 주시 면 됩 니 다.
if (rate <= 0){
rate = 0;
}
if (rate >= 1) {
rate = 1;
}
방금 recycle View 의 감청 을 통 해 광고 아 이 템 위치 와 광고의 효과 적 인 이동 거 리 를 얻 었 습 니 다.그림 의 효과 적 인 이동 거 리 는 이미지 View 의 onDraw 방법 을 사용자 정의 하여 얻 을 수 있 습 니 다.int maxDy = h - itemHeight;
//사진 이동 가능 한 최대 거 리 는(사진 유효 이동 거리):(0~-maxdy)마지막 으로 canvas.translate(0,-rate*maxDy)를 호출 합 니 다.방법 은 전체 효 과 를 실현 할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.