Membuat aplikasi android sederhana untuk membaca file PDF yang ada di HP android menggunakan Sketchware, silahkan ikuti langkah demi langkahnya.
1. Buat proyek baru di Scetchware sepeti pada gambar dibawah ini:
linear2: LinearH untuk tombol/alat.
linear3: LinearV untuk display gambar. Silahkan Set pada padding ke 0.
button1: Untuk mengambil file PDF.
edittext1: EditText untuk menampilkan nomor halaman. Setting ke tipe numberSigned.
textview4: TextView untuk menampilkan total nomor halaman.
textview3: Untuk tombol menuju ke nomor halaman pada edittext1.
textview1: Untuk tombol previous Halaman.
textview2: Untuk tombol Berpindah ke halaman selanjutnya.
2. Hapus Bilah Alat dan Bilah Status pada Tampilan ini untuk menjadikannya layar penuh..
3. Tambahkan Komponen File Picker file_picker: application/pdf.
4. Tambahkan Variabel Nomor dengan nama page dan pageCount, selanjutnya tambahkan String variabel dengan nama pdfFile. Juga tambahkan String list.
5. Tambahkan block pada more blocks: berikan nama extra dan display page(i). Lihat gambar
6. Pada onCreate event gunakan dan tambahkan sumber langsung dan masukkan kode berikut.
touch = new ZoomableImageView(this);
linear3.addView(touch);
Kode ini menciptakan ZoomableImageView baru (didefinisikan sebagai kelas baru nanti) dan menambahkannya ke linear3.
7. Pada event button1 onClick, Tutup renderer jika terbuka dan gunakan FilePicker pilih file Blokir.
Pada block add source directly gunakan kode berikut ini:
if (renderer != null){
renderer.close(); }
8. Pada More Block 'extra' gunakan kode berikut ini:
i. Untuk menerapkan PdfRenderer and ZoomableImageView.
} private android.graphics.pdf.PdfRenderer renderer;
ZoomableImageView touch;
ii. Tentukan Tampilan baru yang disebut ZoomableImageView.
public class ZoomableImageView extends ImageView {
Matrix matrix = new Matrix();
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
static final int CLICK = 3;
int mode = NONE;
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 4f;
float[] m;
float redundantXSpace, redundantYSpace;
float width, height;
float saveScale = 1f;
float right, bottom, origWidth, origHeight, bmWidth, bmHeight;
ScaleGestureDetector mScaleDetector;
Context context;
public ZoomableImageView(Context context) {
super(context);
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
matrix.setTranslate(1f, 1f);
m = new float[9];
setImageMatrix(matrix); setScaleType(ScaleType.MATRIX);
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: last.set(event.getX(), event.getY()); start.set(last); mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN: last.set(event.getX(), event.getY()); start.set(last);
mode = ZOOM;
break;
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM || (mode == DRAG && saveScale > minScale)) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
float scaleWidth = Math.round(origWidth * saveScale);
float scaleHeight = Math.round(origHeight * saveScale);
if (scaleWidth < width) {
deltaX = 0;
if (y + deltaY > 0) deltaY = -y;
else if (y + deltaY < -bottom) deltaY = -(y + bottom);
} else if (scaleHeight < height) {
deltaY = 0;
if (x + deltaX > 0) deltaX = -x;
else if (x + deltaX < -right) deltaX = -(x + right);
} else {
if (x + deltaX > 0) deltaX = -x;
else if (x + deltaX < -right) deltaX = -(x + right);
if (y + deltaY > 0) deltaY = -y;
else if (y + deltaY < -bottom) deltaY = -(y + bottom);
}
matrix.postTranslate(deltaX, deltaY);
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK) performClick();
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
setImageMatrix(matrix);
invalidate();
return true;
}
});
}
@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
bmWidth = bm.getWidth();
bmHeight = bm.getHeight(); }
public void setMaxZoom(float x) {
maxScale = x; }
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
mode = ZOOM;
return true;}
@Override
public boolean onScale(ScaleGestureDetector detector) {
float mScaleFactor = detector.getScaleFactor();
float origScale = saveScale;
saveScale *= mScaleFactor;
if (saveScale > maxScale){
saveScale = maxScale;
mScaleFactor = maxScale / origScale;
} else if (saveScale < minScale) {
saveScale = minScale;
mScaleFactor = minScale / origScale;}
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
if (origWidth * saveScale <= width || origHeight * saveScale <= height) {
matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2);
if (mScaleFactor < 1) {
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
if (mScaleFactor < 1) {
if (Math.round(origWidth * saveScale) < width) {
if (y < -bottom) matrix.postTranslate(0, -(y + bottom));
else if (y > 0) matrix.postTranslate(0, -y);
} else {
if (x < -right) matrix.postTranslate(-(x + right), 0);
else if (x > 0) matrix.postTranslate(-x, 0);}
}
}
} else {
matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY()); matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
if (mScaleFactor < 1) {
if (x < -right) matrix.postTranslate(-(x + right), 0);
else if (x > 0) matrix.postTranslate(-x, 0);
if (y < -bottom) matrix.postTranslate(0, -(y + bottom));
else if (y > 0) matrix.postTranslate(0, -y);}
}
return true;
}
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = MeasureSpec.getSize(widthMeasureSpec);
height = MeasureSpec.getSize(heightMeasureSpec);
float scale;
float scaleX = width / bmWidth;
float scaleY = height / bmHeight;
scale = Math.min(scaleX, scaleY); matrix.setScale(scale, scale); setImageMatrix(matrix);
saveScale = 1f;
redundantYSpace = height - (scale * bmHeight) ;
redundantXSpace = width - (scale * bmWidth);
redundantYSpace /= 2;
redundantXSpace /= 2; matrix.postTranslate(redundantXSpace, redundantYSpace);
origWidth = width - 2 * redundantXSpace;
origHeight = height - 2 * redundantYSpace;
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); setImageMatrix(matrix);}
}
iii. Yang terakhir masukkan sumber add lain secara langsung blok dengan kode berikut.
{
8. Selanjutnya tentukan halaman tampilan More Block (i).
i. Dalam sebuah sumber tambahan, secara langsung blok masukkan kode berikut (Kode ini akan membuka halaman pdf menggunakan PdfRenderer dan menampilkannya di ZoomableImageView):
android.graphics.pdf.PdfRenderer.Page page = renderer.openPage((int)_i);
Bitmap mBitmap = Bitmap.createBitmap((int)getDip(page.getWidth()), (int)getDip(page.getHeight()), Bitmap.Config.ARGB_8888);
page.render(mBitmap, null, null, android.graphics.pdf.PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
touch.setImageBitmap(mBitmap);
page.close();
Di sini (int) _i mewakili variabel angka i di Blok yang lebih banyak.
ii. Gunakan blok untuk menampilkan i +1 di EditText.
9. Dalam event file_picker onFilesPicked, gunakan blok seperti yang ditunjukkan pada gambar di bawah ini:
i. Set String pdfFile ke path dari file yang dipilih.
ii. Atur halaman variabel angka ke 0. aku aku aku. Gunakan kode coba {} catch (Exception) {} dan tentukan renderer dan atur pageCount ke pageCount yang diperoleh dari renderer. Gunakan kode berikut di blokir sumber tambahan secara langsung:
try {
renderer = new android.graphics.pdf.PdfRenderer(new ParcelFileDescriptor(ParcelFileDescriptor.open(new java.io.File(pdfFile), ParcelFileDescriptor.MODE_READ_ONLY)));
pageCount = renderer.getPageCount();
iv. Display the first page using the More Block display page (page).
v. Setel text pada textview4 ke pageCount.
vi. Catch Exception gunakan kode berikut ini:
} catch (Exception e){ }
10. Pada event textview1 onClick, pindah ke halaman sebelumnya. Gunakan blok seperti yang ditunjukkan pada gambar di bawah:
11. Pada event textview2 onClick, pindah ke halaman berikutnya. Gunakan blok seperti yang ditunjukkan pada gambar di bawah:
12. Pada event textview3 onClick, pindah ke nomor halaman yang dimasukkan di edittext1. Gunakan blok seperti yang ditunjukkan pada gambar di bawah:
13. Simpan and run proyek. Sekarang Anda dapat memilih file PDF dan melihatnya di ZoomableImageView ditambahkan ke linear3.
SHARE
















