스스로 바퀴를 만든다--실용적인 안드로이드 광고란 실현 과정(一)

6310 단어
개원계에는'바퀴를 중복 발명하지 말라'는 유명한 말이 있다. 물론 오늘의 내 관점은 이 말을 반박하려는 것이 아니다. 바퀴 이론은 우리의 개발에 지대한 편리를 가져왔다. 프로젝트에서 일부 기능을 실현하려면 인터넷에서 찾아보고 보통 유명한 라이브러리를 추천한다. 나 자신도 이렇게 한다. 그러나 내가 말하고 싶은 것은 바퀴를 사용할 줄 알고바퀴를 어떻게 만드는지 알아야 하고, 필요할 때도 스스로 바퀴를 만들어야 한다.
유래
이전에 프로젝트에서 다마지아의 안드로이드 Image Slider를 사용했는데 처음에는 놀라운 애니메이션 전환 효과에 끌렸고 각종 사용자 정의 속성 애니메이션도 있어서 기분이 좋았다. 그러나 프로젝트의 진전과 시간의 추이에 따라 나는 그것이 못하는 것이 없다는 것을 알게 되었다. 심지어 나는 그것이 보기 좋을 뿐 실용적이지 않다는 것을 발견했다. 나는 내가 발견한 문제점을 열거했다.
  • 라이브러리에 Picasso가 통합되어 있는데 Picasso는 메모리를 매우 소모한다. 이 점은 내가 앞서 언급한 바와 같이 왜 그림이 나를 불러오는지 먼저 Glide가 언급했다. 한 페이지에 광고가 있고 목록이 있으면 페이지가 심각하게 끊긴다.
  • 애니메이션 효과가 너무 현란해서 실제 프로젝트에서 하나도 사용하지 않고 보통 표준 모드를 사용한다.
  • 너무 많은 의존 패키지, 현재의 많은 프로젝트는android 4.0 이상 버전에서 개발한 nineoldandroid는 이미 필요 없음
  • 페이지 클릭 이벤트가 직관적이지 않습니다. ListView 같은 OnItem ClickListener가 있었으면 좋겠습니다
  • 요컨대, 나는 그것이 지금 이미 좀 비대해졌다고 생각한다.물론 저도 인터넷에서 더 간결하고 실용적인 대체 라이브러리를 찾고 있습니다. 예를 들어 BGA Banner-Android입니다. 하지만 사실도 잔혹합니다. 인터넷 사진이 지원되지 않습니다. 그리고 제가 뛰고 코드 부분을 보기 위해 구덩이가 하나 더 있습니다.
    if (mAutoPlayAble && views.size() < 3) { 
           throw new IllegalArgumentException("              "); 
    } 
    

    3장 이하의 사진은 바로 이상을 던질 수 있는데, 이것은 내가 어떻게 쓰는지, 수요도 내가 통제할 수 있는 것이 아니다.물론 상기 두 개의 라이브러리의 저자를 나는 모두 좋아한다. 이 두 개의 라이브러리도 매우 괜찮다. 그렇지 않으면 내가 시간을 들여 연구할 가치가 없다.
    바퀴에 대한 나의 요구
    자신의 이해와 결합하여 나는 두 개의 창고에 모두 취할 만한 점이 있고 부족한 점이 있다고 생각한다. 나는 장점을 취하여 단점을 보완하고 자신의 바퀴를 만든다. 나는 이 바퀴에 대한 요구가 있다.
  • 무한 라운드
  • 자동 수동 슬라이딩
  • 간단한 사용자 정의 표시기 스타일 및 위치
  • 로컬 이미지 및 네트워크 이미지 지원
  • 원활한 슬라이딩, 카드 없음, 깜박임 없음
  • 광고 페이지 개수 제한 없음
  • 페이지 클릭 감청 이벤트
  • 간단하고 사용하기 쉬우며 높은 설정, 뚜렷한 버그 애니메이션 효과가 없기 때문에 저는 먼저 포기하려고 합니다. 기본적인 것이 좋고 실용적인 것을 위주로 합니다.

  • 시작 step by step
    시스템이 페이지를 미끄러뜨릴 수 있는 컨트롤러는 ViewPager와 ViewFliper 인터넷, 그리고 대신이 RecyclerView로 ViewPager와 유사한 효과를 실현했다. 여기서 많은 연구를 하지 않고 가장 많은 ViewPager를 슬라이딩 컨트롤러로 선택했다. ViewPager+PagerAdapter를 사용하면 페이지를 넘기는 효과를 쉽게 실현할 수 있지만 몇 가지 폐단이 존재한다.
  • 무한 회전이 불가능한 페이지 넘기기(첫 번째 또는 마지막 쪽으로 미끄러지면 계속 미끄러질 수 없음)
  • 전환 속도가 너무 빨라서 시스템이 기본적으로 250밀리초이고 광고 표시줄 전환으로 사용하면 뚜렷하게 깜박거린다
  • 수동 슬라이딩만 지원되며 자동 전환은 지원되지 않음
  • ListView와 유사한 OnItem Click Listener의 직접적인 감청을 제공하지 않아 사용하기에 불편하다. 물론 다른 구덩이가 있을 수 있다. 부딪히면 해결하고 위의 문제부터 해결한다
  • 무한 라운드 효과
    여기에 인터넷에서 통용되는 해결 방법을 채택한다. 위조 라운드 방송(사용자에게 라운드 방송의 가상을 보여주고 실제로는 많은 페이지를 사용하여 끊임없이 반복적으로 나타난다. 만약에 사용자가 수십억 아래로 미끄러지면 끝까지 미끄러질 수 있지만 실제로는 거의 사람이 이렇게 할 수 없다)은 구체적인 실현 코드를 본다.
      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)

    좋은 웹페이지 즐겨찾기