* 물이 하나도 채워지지 않은 (progress 가 0) 이미지 ic_water_empty.png 와 물이 모두 채워진 (progress 가 100) 이미지 ic_water_full.png 가 필요

 

 

MainActivity.java

public class MainActivity extends AppCompatActivity {
 
    // progress 만큼 물이 채워지는 애니메이션
    private ValueAnimator mAnimation = new ValueAnimator();
    // 프로그레스를 보여줄 뷰
    FrameLayout progressBar;
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        progressBar = findViewById(R.id.progressBar);
        Button btnStart = findViewById(R.id.btnStart);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // ex) 80% 까지 물이 채워짐
                updateProgress(80);
            }
        });
 
        // 애니메이션
        mAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(@NonNull ValueAnimator valueAnimator) {
                // 애니메이션 프레임마다 호출 - 배경 drawable의 level 만큼 위로 차오른다
                progressBar.getBackground().setLevel((Integer) valueAnimator.getAnimatedValue());
            }
        });
        mAnimation.setDuration(2000);
    }
 
    // 프로그레스 업데이트 : progress - 0~100
    private void updateProgress(int progress) {
        progress = Math.max(0, progress);
        progress = Math.min(progress, 100);
        // ClipDrawable은 0~10000 사이의 level 값
        int level = (int) Math.round((double) progress / 100 * 10000);
        // 0~level 값만큼 애니메이션 실행
        mAnimation.setIntValues(0, level);
        mAnimation.start();
    }
}
 
cs

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <FrameLayout
        android:id="@+id/progressBar"
        android:background="@drawable/progress_water"
        android:layout_centerInParent="true"
        android:layout_width="128dp"
        android:layout_height="128dp" />
 
    <Button
        android:id="@+id/btnStart"
        android:text="Start"
        android:layout_marginTop="24dp"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
 
</RelativeLayout>
cs

 

 

progress_water.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_water_empty" />
    <item android:drawable="@drawable/progress_water_clip" />
</layer-list>
cs

 

 

progress_water_clip.xml

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_water_full"
    android:clipOrientation="vertical"
    android:gravity="bottom">
</clip>
cs

 

 

결과

PdfRenderActivity.java

public class PdfRenderActivity extends AppCompatActivity {
 
    ViewPager2 mViewPager;
    PdfRenderAdapter mAdapter;
    List<Bitmap> mPageBitmaps = new ArrayList<>();
 
    PdfRenderer mRenderer;
    ParcelFileDescriptor mDescriptor;
 
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdfrender);
        mViewPager = findViewById(R.id.viewPager);
 
 
        try {
            // Assets 폴더의 .pdf 파일 -> File 객체로 복사
            InputStream is = getAssets().open("SampleTest.pdf");
            File outFile = new File(getFilesDir(), "SampleTest.pdf");
            OutputStream os = new FileOutputStream(outFile);
 
            byte[] buffer = new byte[1024*1024];
            int length;
            while( (length = is.read(buffer)) > 0 ) {
                os.write(buffer, 0length);
            }
            os.flush();
            os.close();
            is.close();
 
 
            // PDF 파일을 Bitmap 으로 변환하여 뷰페이저로 보기
            // 파일을 읽기 모드로 open
            mDescriptor = ParcelFileDescriptor.open(outFile, ParcelFileDescriptor.MODE_READ_ONLY);
            // PdfRender 객체와 pdf 파일을 연결
            mRenderer = new PdfRenderer(mDescriptor);
 
            // 페이지수만큼 반복
            for ( int i = 0; i < mRenderer.getPageCount(); i++ ) {
                // 페이지 열기
                PdfRenderer.Page page = mRenderer.openPage(i);
                // pdf 페이지를 bitmap 으로 변환하여 사용자에게 보여주기
                Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
                page.render(bitmap, nullnull, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
 
                this.mPageBitmaps.add(bitmap);
                page.close();
            }
 
            // 뷰페이저로 보여주기
            mAdapter = new PdfRenderAdapter(this.mPageBitmaps);
            mViewPager.setAdapter(this.mAdapter);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Override
    protected void onDestroy() {
        // 리소스 닫기
        try {
            if(mDescriptor != null) {
                mDescriptor.close();
            }
            if(mRenderer != null) {
                mRenderer.close();
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
 
        super.onDestroy();
    }
}
cs

 

 

PdfRenderAdapter.java

public class PdfRenderAdapter extends RecyclerView.Adapter<PdfRenderAdapter.PdfRenderHolder> {
 
    private List<Bitmap> bitmaps;
 
    public PdfRenderAdapter(List<Bitmap> bitmaps) {
        this.bitmaps = bitmaps;
    }
 
 
    @NonNull
    @Override
    public PdfRenderHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pdfrender, parent, false);
        return new PdfRenderHolder(view);
    }
 
    @Override
    public void onBindViewHolder(@NonNull PdfRenderHolder holder, int position) {
        holder.imageView.setImageBitmap(this.bitmaps.get(position));
    }
 
    @Override
    public int getItemCount() {
        return bitmaps.size();
    }
 
    static class PdfRenderHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
 
        public PdfRenderHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
        }
    }
}
 
cs

 

 

activity_pdfrender.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
</LinearLayout>
cs

 

 

item_pdfrender.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <ImageView
        android:id="@+id/imageView"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
</LinearLayout>
cs

 

 

build.gradle.kts

    implementation ("androidx.viewpager2:viewpager2:1.1.0")
cs

 

 

결과

public class WebViewActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_webview);
 
        // 웹뷰 + 구글 Docs뷰어
        WebView webView = findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        // 인터넷에 있는 pdf 문서만 가능
        // 앱내 로컬에 있는 pdf 문서를 보기위해서는 라이브러리를 사용하여 로컬 웹서버로 url 호출해야 한다
        String pdfUrl = "https://www.navercorp.com/navercorp_/resource/Naver_Hands_Introduction_2023.pdf";
        webView.loadUrl("https://docs.google.com/gview?embedded=true&url=" + pdfUrl);
    }
}
 
cs

 

 

    <uses-permission android:name="android.permission.INTERNET" />
cs

 

 

결과

250

+ Recent posts