Переглянути джерело

[콘텐츠][New] 카드형 커버는 화면 비율이 세로로 너무 길 경우 상하단에 검은 띠를 추가하여 이미지 비율을 맞춘다.

hyodong.min 6 роки тому
батько
коміт
d8d0389020

+ 8 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsAdapter.java

@@ -41,6 +41,8 @@ public class ContentsAdapter extends RecyclerView.Adapter<ContentsHolder> {
   private SeriesItemBean seriesInfo;
   private final String listType;
   private final String contentsNo;  // 현재 컨텐츠 와 비교하기 위해서 필요
+  private int screenWidth;
+  private int screenHeight;
 
   private static final int LISTICLE_COVER = 0;
   private static final int LISTICLE_DETAIL = 1;
@@ -57,6 +59,8 @@ public class ContentsAdapter extends RecyclerView.Adapter<ContentsHolder> {
   public ContentsAdapter(Activity activity,
                          String contentsNo,
                          String listType,
+                         int screenWidth,
+                         int screenHeight,
                          List<ContentsItemBean> contentsItemBeans,
                          List<SeriesItemBean> seriesItemBeans,
                          SeriesItemBean seriesInfo,
@@ -71,6 +75,8 @@ public class ContentsAdapter extends RecyclerView.Adapter<ContentsHolder> {
     this.seriesInfo = seriesInfo;
     this.listType = listType;
     this.contentsNo = contentsNo;
+    this.screenWidth = screenWidth;
+    this.screenHeight = screenHeight;
   }
 
   @NonNull
@@ -80,7 +86,7 @@ public class ContentsAdapter extends RecyclerView.Adapter<ContentsHolder> {
     switch (viewType) {
       case LISTICLE_COVER:
         view = inflater.inflate(R.layout.contents_listicle_cover, parent, false);
-        return new ContentsListicleCoverHolder(view, hasSeries() ? contentsItemBeans.get(0).getSeriesTitle() : "");
+        return new ContentsListicleCoverHolder(view, hasSeries() ? contentsItemBeans.get(0).getSeriesTitle() : "", screenWidth, screenHeight);
       case LISTICLE_DETAIL:
         view = inflater.inflate(R.layout.contents_listicle_detail, parent, false);
         return new ContentsListicleHolder(view, activity);
@@ -94,7 +100,7 @@ public class ContentsAdapter extends RecyclerView.Adapter<ContentsHolder> {
         /* falls through */
       case CARD_LISTICLE_COVER:
         view = inflater.inflate(R.layout.contents_card_listicle_cover, parent, false);
-        return new ContentsCardCoverHolder(view);
+        return new ContentsCardCoverHolder(view, screenWidth, screenHeight);
       case CARD_DETAIL:
         view = inflater.inflate(R.layout.contents_card_listicle_detail, parent, false);
         return new ContentsCardHolder(view);

+ 7 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsCardCoverHolder.java

@@ -2,6 +2,7 @@ package kr.co.zumo.app.lifeplus.view.screen.contents;
 
 import android.graphics.drawable.Drawable;
 import android.support.annotation.Nullable;
+import android.support.constraint.ConstraintLayout;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
@@ -32,15 +33,15 @@ import kr.co.zumo.app.lifeplus.view.Visibler;
  * @history 하세미   [2018-11-28]   [최초 작성]
  * @since 2018-11-28
  */
-public class ContentsCardCoverHolder extends ContentsHolder<ContentsItemBean> {
+public class ContentsCardCoverHolder extends ContentsCoverHolder<ContentsItemBean> {
 
   private ImageView imageViewCardListicleCover;
   private ImageView imageViewShopping;
   private View dimTop;
   private View dimBottom;
 
-  public ContentsCardCoverHolder(View itemView) {
-    super(itemView);
+  public ContentsCardCoverHolder(View itemView, int screenWidth, int screenHeight) {
+    super(itemView, screenWidth, screenHeight);
     imageViewCardListicleCover = itemView.findViewById(R.id.image_view_card_listicle_cover);
     dimTop = itemView.findViewById(R.id.view_dim_top);
     dimBottom = itemView.findViewById(R.id.view_dim_bottom);
@@ -50,6 +51,9 @@ public class ContentsCardCoverHolder extends ContentsHolder<ContentsItemBean> {
 
   @Override
   protected void bindInternal() {
+
+    setPaddingByRatio((ConstraintLayout) itemView, imageViewCardListicleCover);
+
     imageViewShopping.setVisibility(ContentsItemBean.TYPE_ATTRIBUTE_PURCHASE.equals(bean.getListAttributeType()) ? View.VISIBLE : View.GONE);
     Glide.with(imageViewCardListicleCover)
       //    .asBitmap()

+ 56 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsCoverHolder.java

@@ -0,0 +1,56 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.contents;
+
+import android.support.constraint.ConstraintLayout;
+import android.support.constraint.ConstraintSet;
+import android.view.View;
+import android.widget.ImageView;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
+
+/**
+ * ContentsCoverHolder
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-04-11]   [최초 작성]
+ * @since 2019-04-11
+ */
+public abstract class ContentsCoverHolder<T> extends ContentsHolder<T> {
+  private int screenWidth;
+  private int screenHeight;
+  public ContentsCoverHolder(View itemView, int screenWidth, int screenHeight) {
+    super(itemView);
+    this.screenWidth = screenWidth;
+    this.screenHeight = screenHeight;
+  }
+
+  /**
+   * 화면 비율이 1.8 을 초과한다면 상단에 액션바 높이만큼 패딩을 준다.
+   * - 하단 패딩은 이미지 비율을 1.8로 맞추고 남는 경우 넣어준다.
+   */
+  void setPaddingByRatio(ConstraintLayout itemView, ImageView coverImageView) {
+
+    final float baseRatio = 1.8f;
+    if ((float) screenHeight / screenWidth > baseRatio) {
+      int paddingTop = ResourceUtil.getDimension(R.dimen.action_bar_height) + ResourceUtil.getStatusBarHeightManual();
+      int modifiedHeight = screenHeight - paddingTop;
+      itemView.setPadding(0, paddingTop, 0, 0);
+
+      if ((float) modifiedHeight / screenWidth > baseRatio) {
+        // 상단 패딩 이후 여전히 비율이 안맞다면
+        // 이미지 비율을 9:16으로 조절해서 하단 여백을 남김
+        ConstraintSet set = new ConstraintSet();
+        set.clone(itemView);
+        set.setDimensionRatio(coverImageView.getId(), "9:16");
+        set.applyTo(itemView);
+      }
+    }
+
+  }
+}

+ 257 - 255
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsFragment.java

@@ -44,282 +44,284 @@ import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
  */
 public class ContentsFragment extends FragmentBase<ContentsPresenter> implements IContentsView {
 
-    private RecyclerView recyclerViewContentsDetail;
-    private ActionBarHelper actionBarHelper;
-    private ContentsAdapter adapter;
-    private LinearLayoutManager layoutManager;
-    private View dim;
-    private TextView textViewPageNumber;
-    private Tutorial tutorial;
-
-    private RecyclerView.OnScrollListener scrollEventListener;
-
-    @Override
-    protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
-        return inflater.inflate(R.layout.fragment_contents_detail, container, false);
+  private RecyclerView recyclerViewContentsDetail;
+  private ActionBarHelper actionBarHelper;
+  private ContentsAdapter adapter;
+  private LinearLayoutManager layoutManager;
+  private View dim;
+  private TextView textViewPageNumber;
+  private Tutorial tutorial;
+
+  private RecyclerView.OnScrollListener scrollEventListener;
+
+  @Override
+  protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+    return inflater.inflate(R.layout.fragment_contents_detail, container, false);
+  }
+
+  @Override
+  protected void onAfterActivityCreated(Bundle savedInstanceState) {
+    recyclerViewContentsDetail = findViewById(R.id.recycler_view_contents_detail);
+    dim = findViewById(R.id.view_dim_2);
+    textViewPageNumber = findViewById(R.id.text_view_page_number);
+    TextUtil.toBold(textViewPageNumber);
+
+    //private String direction = null;
+    CustomPagerSnapHelper snapHelper = new CustomPagerSnapHelper();
+    snapHelper.attachToRecyclerView(recyclerViewContentsDetail);
+  }
+
+  @Override
+  protected void defineActionBar(ActionBarHelper actionBarHelper) {
+    actionBarHelper.begin()
+      .dotDotDot(actionBar -> presenter.onNavigationClickDotDotDot(actionBar))
+      .back(actionBar -> presenter.onNavigationClickBack(actionBar))
+      .home(actionBar -> presenter.onNavigationClickHome(actionBar))
+      .bookmark(actionBar -> presenter.onNavigationClickBookmark(actionBar))
+      .like(actionBar -> presenter.onNavigationClickLike(actionBar))
+      .share(actionBar -> presenter.onNavigationClickShare(actionBar))
+      .white()
+      .transparent()
+      .show();
+    this.actionBarHelper = actionBarHelper;
+
+  }
+
+  @Override
+  protected ContentsPresenter definePresenter() {
+    return new ContentsPresenter(getModel(ContentsModel.class), this);
+  }
+
+  @Override
+  protected void onAfterDestroyView() {
+    recyclerViewContentsDetail.removeOnScrollListener(scrollEventListener);
+  }
+
+  @Override
+  protected void onAfterDestroy() {
+    if (null != tutorial) {
+      tutorial.cancel();
     }
+  }
 
-    @Override
-    protected void onAfterActivityCreated(Bundle savedInstanceState) {
-        recyclerViewContentsDetail = findViewById(R.id.recycler_view_contents_detail);
-        dim = findViewById(R.id.view_dim_2);
-        textViewPageNumber = findViewById(R.id.text_view_page_number);
-        TextUtil.toBold(textViewPageNumber);
-
-        //private String direction = null;
-        CustomPagerSnapHelper snapHelper = new CustomPagerSnapHelper();
-        snapHelper.attachToRecyclerView(recyclerViewContentsDetail);
-    }
-
-    @Override
-    protected void defineActionBar(ActionBarHelper actionBarHelper) {
-        actionBarHelper.begin()
-                .dotDotDot(actionBar -> presenter.onNavigationClickDotDotDot(actionBar))
-                .back(actionBar -> presenter.onNavigationClickBack(actionBar))
-                .home(actionBar -> presenter.onNavigationClickHome(actionBar))
-                .bookmark(actionBar -> presenter.onNavigationClickBookmark(actionBar))
-                .like(actionBar -> presenter.onNavigationClickLike(actionBar))
-                .share(actionBar -> presenter.onNavigationClickShare(actionBar))
-                .white()
-                .transparent()
-                .show();
-        this.actionBarHelper = actionBarHelper;
-
-    }
-
-    @Override
-    protected ContentsPresenter definePresenter() {
-        return new ContentsPresenter(getModel(ContentsModel.class), this);
-    }
-
-    @Override
-    protected void onAfterDestroyView() {
-        recyclerViewContentsDetail.removeOnScrollListener(scrollEventListener);
-    }
-
-    @Override
-    protected void onAfterDestroy() {
-        if (null != tutorial) {
-            tutorial.cancel();
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        if (null != tutorial) {
-            tutorial.cancel();
-        }
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        ScreenSizeHelper helper = getHelper(ScreenSizeHelper.class);
-        tutorial = new Tutorial(helper.getScreenWidth());
-    }
-
-    @Override
-    protected boolean isSkipScreenWhenBack() {
-        return false;
-    }
-
-    @Override
-    public void goGooglePlay() {
-        String appPackageName = AppUtil.getPackageName();
-        try {
-            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
-        } catch (ActivityNotFoundException e) {
-            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
-        }
-
-    }
-
-    @Override
-    public void render(String url) {
-    }
-
-    @Override
-    public void setLiked(boolean isChecked) {
-        actionBarHelper.setLiked(isChecked);
-    }
-
-    @Override
-    public void setLiked(boolean isChecked, boolean isAnim) {
-        actionBarHelper.setLiked(isChecked, isAnim);
-
-    }
-
-    @Override
-    public void setBookmarked(boolean isChecked) {
-        actionBarHelper.setBookmarked(isChecked);
-    }
-
-    @Override
-    public void setBookmarked(boolean isChecked, boolean isAnim) {
-        actionBarHelper.setBookmarked(isChecked, isAnim);
+  @Override
+  public void onStop() {
+    super.onStop();
+    if (null != tutorial) {
+      tutorial.cancel();
     }
-
-    @Override
-    public void showOverviewTooltip() {
-        OverviewTooltip tooltip = new OverviewTooltip(getActivity(), new IEventListener() {
-            @Override
-            public void onEvent(Event event) {
-                presenter.onEvent(event);
-            }
-        });
-        tooltip.show();
-    }
-
-    @Override
-    public void setVisibleDotDotDot(boolean isVisible) {
-        actionBarHelper.setVisibleDotDotDot(isVisible);
-    }
-
-    @Override
-    public void setVisiblePageUi(boolean isVisible) {
-        actionBarHelper.setVisibleShare(isVisible);
-        actionBarHelper.setVisibleLiked(isVisible);
-        actionBarHelper.setVisibleBookmark(isVisible);
-    }
-
-    @Override
-    public void setPhoneNumberInCall(String phoneNumber) {
-        startActivity(new Intent("android.intent.action.DIAL", Uri.parse(phoneNumber)));
-    }
-
-    @Override
-    public void setSeriesLiked(int index, boolean isChecked) {
-        adapter.setSeriesLiked(index, isChecked);
+  }
+
+  @Override
+  public void onStart() {
+    super.onStart();
+    ScreenSizeHelper helper = getHelper(ScreenSizeHelper.class);
+    tutorial = new Tutorial(helper.getScreenWidth());
+  }
+
+  @Override
+  protected boolean isSkipScreenWhenBack() {
+    return false;
+  }
+
+  @Override
+  public void goGooglePlay() {
+    String appPackageName = AppUtil.getPackageName();
+    try {
+      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
+    } catch (ActivityNotFoundException e) {
+      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
     }
 
-    @Override
-    public void setSeriesBookmark(int index, boolean isChecked) {
-        adapter.setSeriesBookmark(index, isChecked);
+  }
+
+  @Override
+  public void render(String url) {
+  }
+
+  @Override
+  public void setLiked(boolean isChecked) {
+    actionBarHelper.setLiked(isChecked);
+  }
+
+  @Override
+  public void setLiked(boolean isChecked, boolean isAnim) {
+    actionBarHelper.setLiked(isChecked, isAnim);
+
+  }
+
+  @Override
+  public void setBookmarked(boolean isChecked) {
+    actionBarHelper.setBookmarked(isChecked);
+  }
+
+  @Override
+  public void setBookmarked(boolean isChecked, boolean isAnim) {
+    actionBarHelper.setBookmarked(isChecked, isAnim);
+  }
+
+  @Override
+  public void showOverviewTooltip() {
+    OverviewTooltip tooltip = new OverviewTooltip(getActivity(), new IEventListener() {
+      @Override
+      public void onEvent(Event event) {
+        presenter.onEvent(event);
+      }
+    });
+    tooltip.show();
+  }
+
+  @Override
+  public void setVisibleDotDotDot(boolean isVisible) {
+    actionBarHelper.setVisibleDotDotDot(isVisible);
+  }
+
+  @Override
+  public void setVisiblePageUi(boolean isVisible) {
+    actionBarHelper.setVisibleShare(isVisible);
+    actionBarHelper.setVisibleLiked(isVisible);
+    actionBarHelper.setVisibleBookmark(isVisible);
+  }
+
+  @Override
+  public void setPhoneNumberInCall(String phoneNumber) {
+    startActivity(new Intent("android.intent.action.DIAL", Uri.parse(phoneNumber)));
+  }
+
+  @Override
+  public void setSeriesLiked(int index, boolean isChecked) {
+    adapter.setSeriesLiked(index, isChecked);
+  }
+
+  @Override
+  public void setSeriesBookmark(int index, boolean isChecked) {
+    adapter.setSeriesBookmark(index, isChecked);
+  }
+
+  @Override
+  public void updateSeriesContents() {
+    if (null != adapter) {
+      adapter.updateSeriesContents();
     }
-
-    @Override
-    public void updateSeriesContents() {
-        if (null != adapter) {
-            adapter.updateSeriesContents();
-        }
-    }
-
-    @Override
-    public void setScrollToPosition(int i) {
-        recyclerViewContentsDetail.scrollToPosition(i);
-    }
-
-    @Override
-    public void setSmoothScrollToPosition(int i) {
-        recyclerViewContentsDetail.smoothScrollToPosition(i);
-    }
-
-    @Override
-    public void draw(String contentsNo, String listType, ContentsDetailListBean contentsDetailListBean) {
-        List<ContentsItemBean> contentsItemBeans = contentsDetailListBean.getItemDetailList();
-        List<SeriesItemBean> seriesItemBeans = contentsDetailListBean.getSeriesItemList();
-        List<WithShownItemBean> withItemBeans = contentsDetailListBean.getWithItemList();
-
-        adapter = new ContentsAdapter(getActivity(), contentsNo, listType, contentsItemBeans, seriesItemBeans, contentsDetailListBean.getSeriesInfo(), withItemBeans, event -> {
-            presenter.onEvent(event);
-        });
-
-        layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false) {
-            /**
-             * 추가 영역을 지정해서 미리 다음 페이지를 준비(로딩)하도록 한다.
-             *
-             * @param state
-             * @return
-             */
-            @Override
-            protected int getExtraLayoutSpace(RecyclerView.State state) {
-                return 1;
-            }
-
-            @Override
-            public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
-                final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
-                    @Override
-                    protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
-                        return 60f / displayMetrics.densityDpi;
-                    }
-                };
-                linearSmoothScroller.setTargetPosition(position);
-                startSmoothScroll(linearSmoothScroller);
-            }
-
+  }
+
+  @Override
+  public void setScrollToPosition(int i) {
+    recyclerViewContentsDetail.scrollToPosition(i);
+  }
+
+  @Override
+  public void setSmoothScrollToPosition(int i) {
+    recyclerViewContentsDetail.smoothScrollToPosition(i);
+  }
+
+  @Override
+  public void draw(String contentsNo, String listType, ContentsDetailListBean contentsDetailListBean) {
+    List<ContentsItemBean> contentsItemBeans = contentsDetailListBean.getItemDetailList();
+    List<SeriesItemBean> seriesItemBeans = contentsDetailListBean.getSeriesItemList();
+    List<WithShownItemBean> withItemBeans = contentsDetailListBean.getWithItemList();
+
+    ScreenSizeHelper sizeHelper = getHelper(ScreenSizeHelper.class);
+
+    adapter = new ContentsAdapter(getActivity(), contentsNo, listType, sizeHelper.getScreenWidth(), sizeHelper.getScreenHeight(), contentsItemBeans, seriesItemBeans, contentsDetailListBean.getSeriesInfo(), withItemBeans, event -> {
+      presenter.onEvent(event);
+    });
+
+    layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false) {
+      /**
+       * 추가 영역을 지정해서 미리 다음 페이지를 준비(로딩)하도록 한다.
+       *
+       * @param state
+       * @return
+       */
+      @Override
+      protected int getExtraLayoutSpace(RecyclerView.State state) {
+        return 1;
+      }
+
+      @Override
+      public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
+        final LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
+          @Override
+          protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
+            return 60f / displayMetrics.densityDpi;
+          }
         };
-        scrollEventListener = new IndexScrollListener(layoutManager, index -> {
-            presenter.onChangedPageIndex(index);
-        });
-        recyclerViewContentsDetail.addOnScrollListener(scrollEventListener);
-
-        recyclerViewContentsDetail.setLayoutManager(layoutManager);
-        recyclerViewContentsDetail.setAdapter(adapter);
+        linearSmoothScroller.setTargetPosition(position);
+        startSmoothScroll(linearSmoothScroller);
+      }
+
+    };
+    scrollEventListener = new IndexScrollListener(layoutManager, index -> {
+      presenter.onChangedPageIndex(index);
+    });
+    recyclerViewContentsDetail.addOnScrollListener(scrollEventListener);
+
+    recyclerViewContentsDetail.setLayoutManager(layoutManager);
+    recyclerViewContentsDetail.setAdapter(adapter);
+  }
+
+  @Override
+  public boolean dispatchBackPressed() {
+    if (null == layoutManager || null == recyclerViewContentsDetail) {
+      return false;
     }
 
-    @Override
-    public boolean dispatchBackPressed() {
-        if (null == layoutManager || null == recyclerViewContentsDetail) {
-            return false;
-        }
-
-        /**
-         * 동영상 풀스크린시 백키 제어를 하기위해 추가했으나 해당 코드가 없어도 잘 작동하여 주석처리
-         */
+    /**
+     * 동영상 풀스크린시 백키 제어를 하기위해 추가했으나 해당 코드가 없어도 잘 작동하여 주석처리
+     */
 //    ContentsHolder holder = (ContentsHolder) recyclerViewContentsDetail.findViewHolderForAdapterPosition(layoutManager.findFirstVisibleItemPosition());
 //    if (null == holder) {
 //      return false;
 //    }
 //    return holder.dispatchBackPressed();
 
-        return false;
+    return false;
+  }
+
+  @Override
+  public void setCardPageNumber(String pageNumber) {
+    dim.setVisibility(View.VISIBLE);
+    textViewPageNumber.setVisibility(View.VISIBLE);
+    textViewPageNumber.setText(pageNumber);
+  }
+
+  @Override
+  public void hideCardPageNumberArea() {
+    dim.setVisibility(View.INVISIBLE);
+    textViewPageNumber.setVisibility(View.INVISIBLE);
+  }
+
+  @Override
+  public void showTutorialListicle() {
+    if (null != tutorial) {
+      tutorial.showTutorial(getActivity(), Tutorial.TUTORIAL_LISTICLE_COVER, new IEventListener() {
+        @Override
+        public void onEvent(Event event) {
+          if (null != presenter) {
+            presenter.onEvent(event);
+          }
+        }
+      });
     }
 
-    @Override
-    public void setCardPageNumber(String pageNumber) {
-        dim.setVisibility(View.VISIBLE);
-        textViewPageNumber.setVisibility(View.VISIBLE);
-        textViewPageNumber.setText(pageNumber);
-    }
+  }
 
-    @Override
-    public void hideCardPageNumberArea() {
-        dim.setVisibility(View.INVISIBLE);
-        textViewPageNumber.setVisibility(View.INVISIBLE);
-    }
+  @Override
+  public void showTutorialListicleDetail() {
+    if (null != tutorial) {
+      tutorial.showTutorial(getActivity(), Tutorial.TUTORIAL_LISTICLE_DETAIL, new IEventListener() {
+        @Override
+        public void onEvent(Event event) {
 
-    @Override
-    public void showTutorialListicle() {
-        if (null != tutorial) {
-            tutorial.showTutorial(getActivity(), Tutorial.TUTORIAL_LISTICLE_COVER, new IEventListener() {
-                @Override
-                public void onEvent(Event event) {
-                    if (null != presenter) {
-                        presenter.onEvent(event);
-                    }
-                }
-            });
         }
-
+      });
     }
 
-    @Override
-    public void showTutorialListicleDetail() {
-        if (null != tutorial) {
-            tutorial.showTutorial(getActivity(), Tutorial.TUTORIAL_LISTICLE_DETAIL, new IEventListener() {
-                @Override
-                public void onEvent(Event event) {
-
-                }
-            });
-        }
-
-    }
+  }
 
-    @Override
-    public int getCurrentPage() {
-        return layoutManager.findFirstVisibleItemPosition();
-    }
+  @Override
+  public int getCurrentPage() {
+    return layoutManager.findFirstVisibleItemPosition();
+  }
 }

+ 6 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsListicleCoverHolder.java

@@ -32,7 +32,7 @@ import kr.co.zumo.app.lifeplus.view.Visibler;
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public class ContentsListicleCoverHolder extends ContentsHolder<ContentsItemBean> {
+public class ContentsListicleCoverHolder extends ContentsCoverHolder<ContentsItemBean> {
 
   private ImageView imageViewBackground;
   private ImageView imageViewArrow;
@@ -49,8 +49,8 @@ public class ContentsListicleCoverHolder extends ContentsHolder<ContentsItemBean
   private View dim;
   private String seriesTitle;
 
-  public ContentsListicleCoverHolder(View itemView, String seriesTitle) {
-    super(itemView);
+  public ContentsListicleCoverHolder(View itemView, String seriesTitle, int screenWidth, int screenHeight) {
+    super(itemView, screenWidth, screenHeight);
     imageViewBackground = itemView.findViewById(R.id.image_view_background);
     imageViewArrow = itemView.findViewById(R.id.image_view_arrow);
     imageViewShopping = itemView.findViewById(R.id.shopping_icon);
@@ -72,6 +72,9 @@ public class ContentsListicleCoverHolder extends ContentsHolder<ContentsItemBean
   @Override
   protected void bindInternal() {
 
+    // 리스티클 커버는 상하 패딩없이 그냥 전체화면으로 표시하면 됨
+    // setPaddingByRatio((ConstraintLayout) itemView, imageViewBackground);
+
     imageViewShopping.setVisibility(ContentsItemBean.TYPE_ATTRIBUTE_PURCHASE.equals(bean.getListAttributeType()) ? View.VISIBLE : View.GONE);
     Glide.with(imageViewBackground)
       //.asBitmap()

+ 18 - 13
app/src/main/res/layout/contents_card_listicle_cover.xml

@@ -4,45 +4,50 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
-  android:layout_height="match_parent">
+  android:layout_height="match_parent"
+  android:background="@color/C000000"
+  tools:paddingTop="52dp">
+
   <ImageView
     android:id="@+id/image_view_card_listicle_cover"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_width="0dp"
+    android:layout_height="0dp"
     android:scaleType="centerCrop"
-    tools:background="@color/CFFFFFF"
+    app:layout_constraintVertical_bias="0"
     app:layout_constraintBottom_toBottomOf="parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent"
+    android:background="@color/CFFFFFF"
     />
 
   <View
     android:id="@+id/view_dim_top"
     android:layout_width="match_parent"
     android:layout_height="226dp"
-    android:rotation="180"
     android:background="@drawable/card_cover_dim_top"
-    app:layout_constraintStart_toStartOf="parent"
-    app:layout_constraintEnd_toEndOf="parent"
-    app:layout_constraintTop_toTopOf="parent"/>
+    android:rotation="180"
+    app:layout_constraintEnd_toEndOf="@+id/image_view_card_listicle_cover"
+    app:layout_constraintStart_toStartOf="@+id/image_view_card_listicle_cover"
+    app:layout_constraintTop_toTopOf="@+id/image_view_card_listicle_cover"/>
 
   <View
     android:id="@+id/view_dim_bottom"
     android:layout_width="match_parent"
     android:layout_height="138dp"
     android:background="@drawable/card_dim_bottom_12"
-    app:layout_constraintEnd_toEndOf="parent"
-    app:layout_constraintBottom_toBottomOf="parent"/>
+    app:layout_constraintBottom_toBottomOf="@+id/image_view_card_listicle_cover"
+    app:layout_constraintEnd_toEndOf="@+id/image_view_card_listicle_cover"
+    app:layout_constraintStart_toStartOf="parent"/>
 
   <ImageView
     android:id="@+id/shopping_icon"
     android:layout_width="wrap_content"
-    app:layout_constraintBottom_toBottomOf="parent"
-    app:layout_constraintEnd_toEndOf="parent"
+    android:layout_height="wrap_content"
     android:layout_marginEnd="25dp"
     android:layout_marginBottom="23dp"
-    android:layout_height="wrap_content"
+    app:layout_constraintBottom_toBottomOf="@+id/image_view_card_listicle_cover"
+    app:layout_constraintEnd_toEndOf="@+id/image_view_card_listicle_cover"
     app:srcCompat="@drawable/icon_shopping_wh"
     />
 </android.support.constraint.ConstraintLayout>

+ 10 - 7
app/src/main/res/layout/contents_listicle_cover.xml

@@ -4,18 +4,21 @@
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
-  android:layout_height="match_parent">
+  android:layout_height="match_parent"
+  android:background="@color/C000000"
+  tools:paddingTop="52dp">
 
   <ImageView
     android:id="@+id/image_view_background"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_width="0dp"
+    android:layout_height="0dp"
+    android:background="@color/CFFFFFF"
     android:scaleType="centerCrop"
-    android:src="@color/CC4C4C4"
     app:layout_constraintBottom_toBottomOf="parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent"
+    app:layout_constraintVertical_bias="0"
 
     />
 
@@ -83,13 +86,13 @@
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:layout_marginStart="30dp"
-    android:layout_marginBottom="6dp"
     android:layout_marginEnd="60dp"
+    android:layout_marginBottom="6dp"
     android:lineSpacingExtra="6dp"
     android:textColor="@color/CFFFFFF"
     android:textSize="16sp"
-    app:layout_constrainedWidth="true"
     app:layout_constrainedHeight="false"
+    app:layout_constrainedWidth="true"
     app:layout_constraintBottom_toTopOf="@+id/text_view_title"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
@@ -106,8 +109,8 @@
     android:lineSpacingExtra="7dp"
     android:textColor="@color/CFFFFFF"
     android:textSize="28sp"
-    app:layout_constrainedWidth="true"
     app:layout_constrainedHeight="false"
+    app:layout_constrainedWidth="true"
     app:layout_constraintBottom_toTopOf="@+id/text_view_tag1"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"