스스로 바퀴를 만든다--실용적인 안드로이드 광고란 실현 과정(一)
유래
이전에 프로젝트에서 다마지아의 안드로이드 Image Slider를 사용했는데 처음에는 놀라운 애니메이션 전환 효과에 끌렸고 각종 사용자 정의 속성 애니메이션도 있어서 기분이 좋았다. 그러나 프로젝트의 진전과 시간의 추이에 따라 나는 그것이 못하는 것이 없다는 것을 알게 되었다. 심지어 나는 그것이 보기 좋을 뿐 실용적이지 않다는 것을 발견했다. 나는 내가 발견한 문제점을 열거했다.
if (mAutoPlayAble && views.size() < 3) {
throw new IllegalArgumentException(" ");
}
3장 이하의 사진은 바로 이상을 던질 수 있는데, 이것은 내가 어떻게 쓰는지, 수요도 내가 통제할 수 있는 것이 아니다.물론 상기 두 개의 라이브러리의 저자를 나는 모두 좋아한다. 이 두 개의 라이브러리도 매우 괜찮다. 그렇지 않으면 내가 시간을 들여 연구할 가치가 없다.
바퀴에 대한 나의 요구
자신의 이해와 결합하여 나는 두 개의 창고에 모두 취할 만한 점이 있고 부족한 점이 있다고 생각한다. 나는 장점을 취하여 단점을 보완하고 자신의 바퀴를 만든다. 나는 이 바퀴에 대한 요구가 있다.
시작 step by step
시스템이 페이지를 미끄러뜨릴 수 있는 컨트롤러는 ViewPager와 ViewFliper 인터넷, 그리고 대신이 RecyclerView로 ViewPager와 유사한 효과를 실현했다. 여기서 많은 연구를 하지 않고 가장 많은 ViewPager를 슬라이딩 컨트롤러로 선택했다. ViewPager+PagerAdapter를 사용하면 페이지를 넘기는 효과를 쉽게 실현할 수 있지만 몇 가지 폐단이 존재한다.
여기에 인터넷에서 통용되는 해결 방법을 채택한다. 위조 라운드 방송(사용자에게 라운드 방송의 가상을 보여주고 실제로는 많은 페이지를 사용하여 끊임없이 반복적으로 나타난다. 만약에 사용자가 수십억 아래로 미끄러지면 끝까지 미끄러질 수 있지만 실제로는 거의 사람이 이렇게 할 수 없다)은 구체적인 실현 코드를 본다.
public class LoopPagerAdapter extends PagerAdapter {
private List views;
public LoopPagerAdapter(List views) {
this.views = views;
}
@Override
public int getCount() {
//Integer.MAX_VALUE = 2147483647
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (views.size() > 0) {
//position % view.size() position [0,view.size())
View view = views.get(position % views.size());
if (container.equals(view.getParent())) {
container.removeView(view);
}
container.addView(view);
return view;
}
return null;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
}
}~~~
, position , ,
pager.setCurrentItem(Integer.MAX_VALUE/2 - Integer.MAX_VALUE/2 % views.size());
#### ViewPager
ViewPager mScroller, duration , :
public void setSliderTransformDuration(int duration) { try { Field mScroller = ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); FixedSpeedScroller scroller = new FixedSpeedScroller(pager.getContext(), null, duration); mScroller.set(pager, scroller); } catch (Exception e) {
}
}
//FixedSpeedScroller.java public class Fixed Speed Scroller extends Scroller {//기본 1초, 위의 방법으로 private int mDuration = 1000을 제어할 수 있습니다.
public FixedSpeedScroller(Context context) {
super(context);
}
public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
public FixedSpeedScroller(Context context, Interpolator interpolator, int duration){
this(context,interpolator);
mDuration = duration;
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
// Ignore received duration, use fixed one instead
super.startScroll(startX, startY, dx, dy, mDuration);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy) {
// Ignore received duration, use fixed one instead
super.startScroll(startX, startY, dx, dy, mDuration);
}
}
####
, Handler Timer , handler ,isAutoPlay ,autoPlayDuration , ,
/*** 자동 로테이션 시작*/public void start AutoPlay() {if(is AutoPlay) {handler.sendEmpty Message Delayed(WHAT AUTO PLAY, autoPlay Duration)}
/**
*
*/
public void stopAutoPlay() {
if (isAutoPlay) {
handler.removeMessages(WHAT_AUTO_PLAY);
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
stopAutoPlay();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
startAutoPlay();
break;
}
return super.dispatchTouchEvent(ev);
}
:
![bannerLayoutDemo.gif](http://upload-images.jianshu.io/upload_images/697635-6e241cb677253652.gif?imageMogr2/auto-orient/strip)
, github, , , , 。
> ,
github:[BannerLayoutDemo](https://github.com/dongjunkun/BannerLayoutDemo)
[ -- Android ( )](http://www.jianshu.com/p/12d45f01e99e)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.