Slide 1

Slide 1 text

C-LIS CO., LTD.

Slide 2

Slide 2 text

C-LIS CO., LTD. ༗ࢁܓೋʢ,FJKJ"3*:"."ʣ C-LIS CO., LTD. AndroidΞϓϦ։ൃऀ ΍ͬͯ·ͤΜ Photo : Koji MORIGUCHI (AUN CREATIVE FIRM)

Slide 3

Slide 3 text

C-LIS CO., LTD. IUUQRJJUBDPNBEWFOUDBMFOEBSNJODPNJ ΈΜίϛ"EWFOU$BMFOEBS

Slide 4

Slide 4 text

C-LIS CO., LTD. IUUQTQMBZHPPHMFDPNTUPSFBQQTEFUBJMT JEKQDPD@MJTLFIBJBOESPJE

Slide 5

Slide 5 text

C-LIS CO., LTD. IUUQTEFQMPZHBUFDPNVTFSTLFJKJ@BSJZBNBBQQTJPLFJKJBTVQEBUFDIFDLFS

Slide 6

Slide 6 text

C-LIS CO., LTD. IUUQTQMBZHPPHMFDPNTUPSFBQQTEFUBJMT JEKQDPD@MJTDDMNPSFMPDBMF .PSF-PDBMF

Slide 7

Slide 7 text

ݟ։͖ͳΜͯେ͖ͬΒ͍

Slide 8

Slide 8 text

C-LIS CO., LTD. ϖʔδͷׂΓ෇͚ ࠨ ӈ

Slide 9

Slide 9 text

C-LIS CO., LTD. ϖʔδͷׂΓ෇͚ʢࠨ௲͡ʣ

Slide 10

Slide 10 text

C-LIS CO., LTD. ϖʔδͷׂΓ෇͚ʢӈ௲͡ʣ D ࠜઇΕ͍

Slide 11

Slide 11 text

C-LIS CO., LTD. 7JFX1BHFS͸ࠨ௲͡ͷಈ͖Λ͢Δ 0 1 2 3

Slide 12

Slide 12 text

͕ͩͪΐͬͱ଴ͬͯཉ͍͠

Slide 13

Slide 13 text

C-LIS CO., LTD. ୺຤ͷॎԣʹԠͯ͡
 දࣔ͢Δϖʔδ਺͕มΘΔ 1 1 2

Slide 14

Slide 14 text

C-LIS CO., LTD. ΞεϖΫτൺ 1 2

Slide 15

Slide 15 text

C-LIS CO., LTD. ΞεϖΫτൺ 1 2

Slide 16

Slide 16 text

C-LIS CO., LTD. ݟ։͖

Slide 17

Slide 17 text

C-LIS CO., LTD. ΞεϖΫτൺ

Slide 18

Slide 18 text

C-LIS CO., LTD. ΞεϖΫτൺ

Slide 19

Slide 19 text

C-LIS CO., LTD. ΞεϖΫτൺ ӈدͤ ࠨدͤ

Slide 20

Slide 20 text

σϞ

Slide 21

Slide 21 text

ίʔυ ϖʔδϯάαϯϓϧ https://github.com/keiji/adventcalendar_2015_mincomi

Slide 22

Slide 22 text

C-LIS CO., LTD. JPLFJKJNJODPNJTBNQMFQBHJOH

Slide 23

Slide 23 text

C-LIS CO., LTD. "MJHO public enum Align {
 Left,
 Right,
 Center;
 
 public static Align flip(Align align) {
 switch (align) {
 case Left:
 return Right;
 case Right:
 return Left;
 default:
 return Center;
 }
 }
 }
 ϖʔδͷࠨӈ൓స

Slide 24

Slide 24 text

C-LIS CO., LTD. #PPL public class Book {
 
 private final Align startPageAlign;
 
 public Align getStartPageAlign() {
 return startPageAlign;
 }
 
 private final List pageList;
 
 public List getPageList() {
 return pageList;
 }
 
 public Book(Align startPageAlign, List pageList) {
 this.startPageAlign = startPageAlign;
 this.pageList = pageList;
 }
 }
 ࠷ॳͷϖʔδͷ഑ஔ

Slide 25

Slide 25 text

C-LIS CO., LTD. 1BHFʢൈਮʣ public class Page implements Parcelable {
 
 private final int number;
 
 public int getNumber() {
 return number;
 }
 
 private final boolean isSpread;
 
 public boolean isSpread() {
 return isSpread;
 }
 
 private final String fileName;
 
 public String getFileName() {
 return fileName;
 }
 
 public Page(int number, boolean isSpread, String fileName) {
 this.number = number;
 this.isSpread = isSpread;
 this.fileName = fileName;
 }
 } ݟ։͖ϖʔδϑϥά

Slide 26

Slide 26 text

C-LIS CO., LTD. SFTMBZPVUGSBHNFOU@QBHFYNM 
 
 
 


Slide 27

Slide 27 text

C-LIS CO., LTD. SFTMBZPVUMBOEGSBHNFOU@QBHFYNM 
 
 
 
 
 
 ϖʔδ഑ஔ͸
 LinearLayoutʹ೚ͤΔ

Slide 28

Slide 28 text

ϖʔδͷׂΓ෇͚

Slide 29

Slide 29 text

C-LIS CO., LTD. ୺຤ͷॎԣʹԠͯ͡
 දࣔ͢Δϖʔδ਺͕มΘΔ 1 1 2

Slide 30

Slide 30 text

C-LIS CO., LTD. ϖʔδͷׂΓ෇͚Λॲཧ͢Δ "CT1BHF"EBQUFS public abstract class AbsPageAdapter {
 
 final Book book;
 
 protected AbsPageAdapter(@NonNull Book book) {
 this.book = book;
 }
 
 public final PageContainer getPage(int position) {
 // ϖʔδͷฒͼΛ൓స
 return getPageInternal(getCount() - position - 1);
 }
 
 public abstract int getCount();
 public abstract PageContainer getPageInternal(int position);
 
 }


Slide 31

Slide 31 text

C-LIS CO., LTD. 1BHF$POUBJOFSʢൈਮʣ public class PageContainer implements Parcelable {
 public final Page center;
 public final Page left;
 public final Page right;
 
 public PageContainer(@NonNull Page center) {
 this.center = center;
 this.left = null;
 this.right = null;
 }
 
 public PageContainer(@Nullable Page left, @Nullable Page right) {
 this.center = null;
 this.left = left;
 this.right = right;
 }
 }

Slide 32

Slide 32 text

C-LIS CO., LTD. ୯ϖʔδදࣔ 4JOHMF1BHF"EBQUFS public class SinglePageAdapter extends AbsPageAdapter {
 
 public SinglePageAdapter(Book book) {
 super(book);
 }
 
 @Override
 public int getCount() {
 return book.getPageList().size();
 }
 @Override
 public PageContainer getPageInternal(int position) {
 
 List pageList = book.getPageList();
 
 Page basePage = pageList.get(position);
 
 // ݟ։͖Ͱͳ͚Ε͹தԝ഑ஔ
 if (!basePage.isSpread()) {
 return new PageContainer(basePage);
 }
 
 Align basePageAlign = book.getStartPageAlign();
 if (position % 2 == 1) {
 basePageAlign = Align.flip(basePageAlign);
 }
 
 Page leftPage = null;
 Page rightPage = null;
 
 if (basePageAlign == Align.Left) {
 leftPage = basePage;
 } else {
 rightPage = basePage;
 }
 
 return new PageContainer(leftPage, rightPage);
 }
 }


Slide 33

Slide 33 text

C-LIS CO., LTD. ̎ϖʔδදࣔ %PVCMF1BHF"EBQUFS public class DoublePageAdapter extends AbsPageAdapter {
 
 public DoublePageAdapter(Book book) {
 super(book);
 }
 
 @Override
 public PageContainer getPageInternal(int position) {
 
 Page rightPage = null;
 Page leftPage = null;
 
 if (position == 0) {
 int pageIndex = 0;
 if (book.getStartPageAlign() == Align.Right) {
 rightPage = getPageByIndex(pageIndex);
 leftPage = getPageByIndex(pageIndex + 1);
 } else {
 leftPage = getPageByIndex(pageIndex);
 }
 } else {
 int pageIndex = position * 2 - 1;
 if (book.getStartPageAlign() == Align.Right) {
 pageIndex++;
 }
 rightPage = getPageByIndex(pageIndex);
 leftPage = getPageByIndex(pageIndex + 1);
 }
 
 return new PageContainer(leftPage, rightPage);
 } @Override
 public int getCount() {
 int basePageCount = book.getPageList().size();
 if (book.getStartPageAlign() == Align.Left) {
 basePageCount++;
 }
 return (basePageCount / 2) + (basePageCount % 2);
 }
 
 private Page getPageByIndex(int index) {
 if (index < 0) {
 return null;
 } else if (index > book.getPageList().size() - 1) {
 return null;
 }
 return book.getPageList().get(index);
 }
 }

Slide 34

Slide 34 text

"EBQUFSͷςετ UFTUKBWBJPLFJKJNJODPNJTBNQMFQBHJOHBEBQUFS

Slide 35

Slide 35 text

C-LIS CO., LTD. 7JFX1BHFSͷ"EBQUFS private static class Adapter extends FragmentPagerAdapter {
 
 private final AbsPageAdapter adapter;
 
 public Adapter(@NonNull FragmentManager fm, AbsPageAdapter adapter) {
 super(fm);
 this.adapter = adapter;
 }
 
 @Override
 public Fragment getItem(int position) {
 PageContainer container = adapter.getPage(position);
 return PageFragment.newInstance(container);
 }
 
 @Override
 public int getCount() {
 return adapter.getCount();
 }
 
 @Override
 public int getItemPosition(Object object) {
 return POSITION_NONE;
 }
 }


Slide 36

Slide 36 text

C-LIS CO., LTD. .BJO"DUJWJUZKBWBʢൈਮʣ @NonNull
 private AbsPageAdapter getPageAdapter() {
 List pageList = new ArrayList<>();
 // লུ 
 Book book = new Book(Align.Left, pageList);
 
 AbsPageAdapter pageAdapter;
 if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
 pageAdapter = new DoublePageAdapter(book);
 } else {
 pageAdapter = new SinglePageAdapter(book);
 }
 
 return pageAdapter;
 }


Slide 37

Slide 37 text

C-LIS CO., LTD. 1BHF'SBHNFOUʢൈਮʣ public class PageFragment extends Fragment {
 private static final String TAG = PageFragment.class.getSimpleName();
 
 private static final String KEY_PAGE = "key_page";
 
 @Nullable
 private PageContainer pageContainer;
 
 @Nullable
 private PageView centerPage;
 
 @Nullable
 private PageView leftPage;
 
 @Nullable
 private PageView rightPage;
 
 @NonNull
 public static PageFragment newInstance(@NonNull PageContainer container) {
 PageFragment fragment = new PageFragment();
 
 Bundle args = new Bundle();
 args.putParcelable(KEY_PAGE, container);
 fragment.setArguments(args);
 
 return fragment;
 }
 
 @Override
 public void onCreate(@Nullable Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 pageContainer = getArguments().getParcelable(KEY_PAGE);
 
 if (pageContainer != null) {
 Log.d(TAG, pageContainer.toString());
 }
 }
 @Nullable
 @Override
 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 
 View view = inflater.inflate(R.layout.fragment_page, container, false);
 if (pageContainer == null) {
 return view;
 }
 
 // ̍ϖʔδ
 centerPage = (PageView) view.findViewById(R.id.centerPage);
 
 if (centerPage != null) {
 if (pageContainer.center != null) {
 centerPage.setPage(pageContainer.center, Align.Center);
 } else if (pageContainer.left != null) {
 centerPage.setPage(pageContainer.left, Align.Left);
 } else if (pageContainer.right != null) {
 centerPage.setPage(pageContainer.right, Align.Right);
 }
 
 return view;
 }
 
 // ̎ϖʔδ
 leftPage = (PageView) view.findViewById(R.id.leftPage);
 rightPage = (PageView) view.findViewById(R.id.rightPage);
 
 if (pageContainer.left != null || pageContainer.right != null) {
 if (leftPage != null) {
 leftPage.setPage(pageContainer.left, Align.Left);
 }
 if (rightPage != null) {
 rightPage.setPage(pageContainer.right, Align.Right);
 }
 }
 
 return view;
 }
 }

Slide 38

Slide 38 text

C-LIS CO., LTD. ݟ։͖ͷ৔߹͸ࠨӈʹدͤΔ 1 ӈدͤ ࠨدͤ

Slide 39

Slide 39 text

C-LIS CO., LTD. public class Viewport {
 // লུ public void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
 if (viewWidth == width && viewHeight == height) {
 return;
 }
 
 viewWidth = width;
 viewHeight = height;
 
 calculateScale();
 }
 
 public void setAlign(@NonNull Align align) {
 this.align = align;
 
 calculateScale();
 }
 
 public void setContentSize(int width, int height) {
 contentWidth = width;
 contentHeight = height;
 
 calculateScale();
 }
 
 private void calculateScale() {
 scale = minScale = Math.min(viewWidth / contentWidth, viewHeight / contentHeight);
 maxScale = minScale * 5.0f;
 
 marginTop = (viewHeight - contentHeight * scale) / 2;
 float left = viewWidth - contentWidth * scale;
 
 switch (align) {
 case Left:
 marginLeft = left;
 break;
 case Right:
 marginLeft = 0;
 break;
 case Center:
 marginLeft = left / 2;
 break;
 }
 
 isInitialized = true;
 }
 // লུ } 7JFXQPSUʢൈਮʣ

Slide 40

Slide 40 text

C-LIS CO., LTD. public class PageView extends View {
 private static final String TAG = PageView.class.getSimpleName();
 
 private final Paint paint = new Paint();
 
 @Nullable
 private Page page;
 
 @Nullable
 private Align align;
 
 @NonNull
 private final Viewport viewport;
 // লུ
 
 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 super.onSizeChanged(w, h, oldw, oldh);
 
 viewport.onSizeChanged(w, h, oldw, oldh);
 }
 
 public void setPage(@Nullable Page page, @NonNull Align align) {
 this.page = page;
 this.align = align;
 
 viewport.setAlign(align);
 
 if (page == null) {
 return;
 }
 
 if (bitmap == null) {
 new LoadThread(page.getFileName()).start();
 }
 }
 // লུ private Bitmap bitmap;
 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 
 if (page == null || bitmap == null) {
 return;
 }
 
 if (!viewport.isInitialized()) {
 return;
 }
 
 if (align == Align.Left) {
 canvas.drawColor(Color.DKGRAY);
 } else {
 canvas.drawColor(Color.LTGRAY);
 }
 
 int sc = canvas.save();
 canvas.translate(viewport.getMarginLeft(), viewport.getMarginTop());
 canvas.scale(viewport.getScale(), viewport.getScale());
 
 canvas.drawBitmap(bitmap, 0, 0, paint);
 
 canvas.restoreToCount(sc);
 
 canvas.drawText(align.name() + ": " + String.valueOf(page.getNumber()), 50, 150, paint);
 }
 // লུ } 1BHF7JFXʢൈਮʣ

Slide 41

Slide 41 text

C-LIS CO., LTD. C-LIS CO., LTD.

Slide 42

Slide 42 text

ຊࢿྉ͸ɺ༗ݶձࣾγʔϦεͷஶ࡞෺Ͱ͢ɻܝࡌ͞Ε͍ͯΔΠϥετ͸ɺಛʹهࡌ͕ͳ͍৔߹͸ࠜઇΕ͍ͷஶ࡞෺Ͱ͢ɻ ຊࢿྉͷશ෦ɺ·ͨ͸Ұ෦ʹ͍ͭͯɺஶ࡞ऀ͔ΒจॻʹΑΔڐ୚Λಘͣʹෳ੡͢Δ͜ͱ͸ې͡ΒΕ͍ͯ·͢ɻ 5IF"OESPJE4UVEJPJDPOJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFE BDDPSEJOHUPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF ֤੡඼໊ɾϒϥϯυ໊ɺձ໊ࣾͳͲ͸ɺҰൠʹ֤ࣾͷ঎ඪ·ͨ͸ొ࿥঎ඪͰ͢ɻຊࢿྉதͰ͸ɺ˜ɺšɺäΛׂѪͯ͠ ͍·͢ɻ 5IF"OESPJESPCPUJTSFQSPEVDFEPSNPEJpFEGSPNXPSLDSFBUFEBOETIBSFECZ(PPHMFBOEVTFEBDDPSEJOH UPUFSNTEFTDSJCFEJOUIF$SFBUJWF$PNNPOT"UUSJCVUJPO-JDFOTF