Android 는 광고 효과 실현 코드 를 알 고 있 습 니 다.

6841 단어 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)를 호출 합 니 다.방법 은 전체 효 과 를 실현 할 수 있다.

좋은 웹페이지 즐겨찾기