Browse Source

ComPDFKit Demo(Android) - 1.新增CPDFSliderBar

liuxiaolong 1 year ago
parent
commit
92af0eb284

+ 132 - 7
compdfkit-tools/src/main/java/com/compdfkit/tools/pdfview/CPDFReaderView.java

@@ -1,6 +1,6 @@
 /**
  * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
- *
+ * <p>
  * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
@@ -10,37 +10,75 @@
 package com.compdfkit.tools.pdfview;
 
 import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
 import android.util.AttributeSet;
 import android.widget.FrameLayout;
+import android.widget.RelativeLayout;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
 
+import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.transition.Transition;
 import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.tools.R;
+import com.compdfkit.tools.utils.glide.CPDFImageLoad;
+import com.compdfkit.tools.utils.glide.pdf.CGlidePDFUrl;
+import com.compdfkit.ui.reader.IReaderViewCallback;
+import com.compdfkit.ui.widget.CPDFSlideBar;
 
 
-public class CPDFReaderView extends FrameLayout {
+public class CPDFReaderView extends RelativeLayout implements IReaderViewCallback {
 
     private com.compdfkit.ui.reader.CPDFReaderView cPdfReaderView;
 
+    private CPDFSlideBar slideBar;
+
+    private boolean enableSliderBar = true;
+
+    private CPDFSlideBar.SlideBarPosition slideBarPosition = CPDFSlideBar.SlideBarPosition.RIGHT;
+
+    private int sliderBarThumbnailWidth = 314;
+    private int sliderBarThumbnailHeight = 444;
+
     public CPDFReaderView(@NonNull Context context) {
-        super(context);
-        initCPDFReaderView();
+        this(context, null);
     }
 
     public CPDFReaderView(@NonNull Context context, @Nullable AttributeSet attrs) {
-        super(context, attrs);
-        initCPDFReaderView();
+        this(context, attrs, 0);
     }
 
     public CPDFReaderView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
+        initAttr(context, attrs);
+        initCPDFReaderView();
+    }
+
+
+    private void initAttr(Context context, AttributeSet attributeSet){
+        TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.Tools_CPDFReaderView);
+        if (typedArray != null) {
+            enableSliderBar = typedArray.getBoolean(R.styleable.Tools_CPDFReaderView_tools_enable_slider_bar, true);
+            int sliderBarPositionEnum = typedArray.getInt(R.styleable.Tools_CPDFReaderView_tools_slider_bar_position, 1);
+            if (sliderBarPositionEnum == 0){
+                slideBarPosition = CPDFSlideBar.SlideBarPosition.LEFT;
+            }else {
+                slideBarPosition = CPDFSlideBar.SlideBarPosition.RIGHT;
+            }
+            sliderBarThumbnailWidth = typedArray.getDimensionPixelOffset(R.styleable.Tools_CPDFReaderView_tools_slider_bar_thumbnail_width, 314);
+            sliderBarThumbnailHeight = typedArray.getDimensionPixelOffset(R.styleable.Tools_CPDFReaderView_tools_slider_bar_thumbnail_height, 444);
+
+        }
     }
 
 
     private void initCPDFReaderView() {
         cPdfReaderView = new com.compdfkit.ui.reader.CPDFReaderView(getContext());
         cPdfReaderView.setDoublePageMode(false);
+        cPdfReaderView.setReaderViewCallback(this);
         addView(cPdfReaderView);
     }
 
@@ -60,6 +98,8 @@ public class CPDFReaderView extends FrameLayout {
             // If the PDF file was successfully opened, set the PDF document of the CPdfReaderView instance to the opened document.
             case PDFDocumentErrorSuccess:
                 cPdfReaderView.setPDFDocument(cpdfDocument);
+                initCPDFSliderBar();
+
                 break;
             // If the PDF file requires a password to be opened, do nothing for now.
             case PDFDocumentErrorPassword:
@@ -71,9 +111,94 @@ public class CPDFReaderView extends FrameLayout {
         }
     }
 
-    public com.compdfkit.ui.reader.CPDFReaderView getCPdfReaderView(){
+    public com.compdfkit.ui.reader.CPDFReaderView getCPdfReaderView() {
         return cPdfReaderView;
     }
 
 
+    @Override
+    public void onTapMainDocArea() {
+
+    }
+
+    @Override
+    public void onMoveToChild(int i) {
+        if (slideBar != null) {
+            slideBar.setPageIndexByAnimation(i, 500);
+        }
+    }
+
+    @Override
+    public void onEndScroll() {
+
+    }
+
+    @Override
+    public void onScrolling() {
+
+    }
+
+    @Override
+    public void onRecordLastJumpPageNum(int i) {
+
+    }
+
+
+    private void initCPDFSliderBar() {
+        if (!enableSliderBar){
+            return;
+        }
+        slideBar = new CPDFSlideBar(getContext());
+        LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
+        slideBar.setLayoutParams(layoutParams);
+        addView(slideBar);
+        int count = cPdfReaderView.getPDFDocument().getPageCount();
+        slideBar.setSlideBarBitmap(R.drawable.tools_ic_pdf_slider_bar_thumbnail);
+        slideBar.setDefaultThumbnailSize(sliderBarThumbnailWidth, sliderBarThumbnailHeight);
+        slideBar.setPageCount(count);
+        slideBar.setSlideBarPosition(slideBarPosition);
+        slideBar.setOnScrollToPageListener(new CPDFSlideBar.OnScrollToPageListener() {
+            int currentScrollPageIndex = -1;
+
+            @Override
+            public void onScrollBegin(int pageIndex) {
+                cPdfReaderView.removeAllAnnotFocus();
+                refreshBitmap(pageIndex);
+            }
+
+            @Override
+            public void onScroll(int i) {
+
+            }
+
+            @Override
+            public void onScrollEnd(int pageIndex) {
+                currentScrollPageIndex = -1;
+                cPdfReaderView.setDisplayPageIndex(pageIndex);
+
+            }
+
+            @Override
+            public void onScrollToPage(int pageIndex) {
+                refreshBitmap(pageIndex);
+            }
+
+            private void refreshBitmap(int pageIndex) {
+                if (currentScrollPageIndex != pageIndex){
+                    currentScrollPageIndex = pageIndex;
+                    CPDFImageLoad.loadPdfPageImage(getContext(),
+                            new CGlidePDFUrl(cPdfReaderView.getPDFDocument(), currentScrollPageIndex, sliderBarThumbnailWidth, sliderBarThumbnailHeight),
+                            cPdfReaderView.getPDFDocument().getAbsolutePath(),
+                            false, false, new SimpleTarget<Bitmap>(sliderBarThumbnailWidth, sliderBarThumbnailHeight) {
+                                @Override
+                                public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
+                                    slideBar.setThumbnailBitmap(resource);
+                                }
+                            }
+                    );
+                }
+            }
+        });
+
+    }
 }

+ 24 - 0
compdfkit-tools/src/main/res/drawable/tools_ic_pdf_slider_bar_thumbnail.xml

@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="48dp"
+    android:viewportWidth="20"
+    android:viewportHeight="48">
+  <path
+      android:pathData="M4,0L16,0A4,4 0,0 1,20 4L20,44A4,4 0,0 1,16 48L4,48A4,4 0,0 1,0 44L0,4A4,4 0,0 1,4 0z"
+      android:strokeWidth="1"
+      android:fillColor="#E6E6E6"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M10,7.4038L15.1265,12.5303C15.4194,12.8232 15.8943,12.8232 16.1872,12.5303C16.4801,12.2374 16.4801,11.7626 16.1872,11.4697L10.5303,5.8128C10.2374,5.5199 9.7626,5.5199 9.4697,5.8128L3.8128,11.4697C3.5199,11.7626 3.5199,12.2374 3.8128,12.5303C4.1057,12.8232 4.5806,12.8232 4.8735,12.5303L10,7.4038Z"
+      android:strokeWidth="1"
+      android:fillColor="#9A9A9A"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M10,40.5962L15.1265,35.4697C15.4194,35.1768 15.8943,35.1768 16.1872,35.4697C16.4801,35.7626 16.4801,36.2374 16.1872,36.5303L10.5303,42.1872C10.2374,42.4801 9.7626,42.4801 9.4697,42.1872L3.8128,36.5303C3.5199,36.2374 3.5199,35.7626 3.8128,35.4697C4.1057,35.1768 4.5806,35.1768 4.8735,35.4697L10,40.5962Z"
+      android:strokeWidth="1"
+      android:fillColor="#9A9A9A"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>

+ 0 - 5
compdfkit-tools/src/main/res/values/colors.xml

@@ -12,11 +12,6 @@
     <color name="tools_border_color">#ff999999</color>
     <color name="tools_black_color">#ff000000</color>
 
-    <color name="upgrade_diff_line">#14000000</color>
-    <color name="reader_tools_button_normal">#F5F5F5</color>
-    <color name="reader_tools_button_clicked">#1E0071EE</color>
-    <color name="search_result_text_color">#333333</color>
-    <color name="search_result_text_highlight">#FFAB00</color>
     <color name="tools_tool_bar_background_color">@android:color/white</color>
     <color name="tools_item_dividing_line_color">#F2F2F2</color>
 </resources>

+ 0 - 5
compdfkit-tools/src/main/res/values/strings.xml

@@ -10,11 +10,6 @@
     <string name="tools_search_result">Search Results</string>
     <string name="tools_search_hint">Input Page</string>
 
-    <string name="common_okay">OK</string>
-    <string name="common_cancel">Cancel</string>
-    <string name="goto_page_dialog_title">Go To Page</string>
-    <string name="goto_page_dialog_msg">Enter a page number</string>
-    <string name="goto_page_dialog_hint">input page</string>
     <string name="tools_thumbnail">Thumbnail</string>
     <string name="tools_outline">Outline</string>
     <string name="tools_more">More</string>

+ 10 - 0
compdfkit-tools/src/main/res/values/tools_attrs.xml

@@ -14,4 +14,14 @@
         <attr name="tools_toolbar_title"/>
         <attr name="tools_toolbar_back_icon" format="reference"/>
     </declare-styleable>
+
+    <declare-styleable name="Tools_CPDFReaderView">
+        <attr name="tools_enable_slider_bar" format="boolean"/>
+        <attr name="tools_slider_bar_position" format="enum">
+            <enum name="left" value="0"/>
+            <enum name="right" value="1"/>
+        </attr>
+        <attr name="tools_slider_bar_thumbnail_width" format="dimension"/>
+        <attr name="tools_slider_bar_thumbnail_height" format="dimension"/>
+    </declare-styleable>
 </resources>

+ 2 - 0
viewer-ctrl-demo/src/main/res/layout/viewer_activity_main.xml

@@ -33,6 +33,8 @@
         android:id="@+id/pdf_reader_view"
         android:layout_width="match_parent"
         android:layout_height="0dp"
+        app:tools_enable_slider_bar="true"
+        app:tools_slider_bar_position="right"
         app:layout_constraintTop_toBottomOf="@id/pdf_tool_bar"
         app:layout_constraintBottom_toBottomOf="parent"/>