1. 程式人生 > >android實現截圖操作

android實現截圖操作

最近開發了一些Android小遊戲,想在遊戲結束或者完成之後把整個螢幕擷取下來並分享到社交平臺上。先上效果吧。


網上一搜,截圖的方法很多。這裡只貼出了一種,將擷取到Bitmap賦給Dialog上的ImageView並彈出對話方塊。對對話方塊加了彈出和收起的動畫。看起來就有截圖的感覺了。下面是所有程式碼。

彈出Dialog方法:包括截圖和彈出Dialog

/**
     * 遊戲切圖dialog分享
     */
    private void popShotSrceenDialog(){
        final AlertDialog cutDialog = new AlertDialog.Builder(this).create();
        View dialogView = View.inflate(this, R.layout.show_cut_screen_layout, null);
        ImageView showImg = (ImageView) dialogView.findViewById(R.id.show_cut_screen_img);
        dialogView.findViewById(R.id.share_cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cutDialog.dismiss();
            }
        });
        dialogView.findViewById(R.id.share_img).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ShotSrceenActivity.this,"點選了share按鈕",Toast.LENGTH_SHORT).show();
            }
        });
        //獲取當前螢幕的大小
        int width = getWindow().getDecorView().getRootView().getWidth();
        int height = getWindow().getDecorView().getRootView().getHeight();
        //生成相同大小的圖片
        Bitmap temBitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );
        //找到當前頁面的跟佈局
        View view = getWindow().getDecorView().getRootView();
        //設定快取
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        //從快取中獲取當前螢幕的圖片
        temBitmap = view.getDrawingCache();
        showImg.setImageBitmap(temBitmap);

        cutDialog.setView(dialogView);
        Window window = cutDialog.getWindow();
        window.setBackgroundDrawableResource(android.R.color.transparent);
        WindowManager m = window.getWindowManager();
        Display d = m.getDefaultDisplay(); // 獲取螢幕寬、高用
        WindowManager.LayoutParams p = window.getAttributes(); // 獲取對話方塊當前的引數值
        p.height = (int) (d.getHeight() * 0.8); // 高度設定為螢幕的0.6
        p.gravity = Gravity.CENTER;//設定彈出框位置
        window.setAttributes(p);
        window.setWindowAnimations(R.style.dialogWindowAnim);
        cutDialog.show();
    }

Dialog佈局就是圖片加按鈕:
<?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">

    <LinearLayout
        android:id="@+id/btn_layout"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/share_img"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="分享"
            android:layout_weight="1"/>

        <Button
            android:id="@+id/share_cancel"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="取消"/>
    </LinearLayout>
    <ImageView
        android:id="@+id/show_cut_screen_img"
        android:layout_above="@id/btn_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

最後有個動畫style和彈出動畫以及收起動畫:
<!--彈出對話方塊動畫-->
    <style name="dialogWindowAnim" parent="android:Animation" mce_bogus="1">
        <item name="android:windowEnterAnimation">@anim/popview_in_amin</item>
        <item name="android:windowExitAnimation">@anim/popview_out_amin</item>
    </style>

彈出動畫:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXScale="0.0"
        android:toXScale="1.0"
        android:fromYScale="0.0"
        android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="200"/>
</set>

收起動畫:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.0"
        android:fromYScale="1.0"
        android:toYScale="0.0"
        android:pivotX="0%"
        android:pivotY="100%"
        android:fillAfter="false"
        android:duration="200"/>
</set>

這樣就完成了上圖的效果,然後加入分享即可,網上說的擷取螢幕用上面的方法所得到的圖片狀態列位置是白色的一片。測試的時候我認為應該是透明的,解決方式是將狀態列設定為透明,然後再主佈局中的最上面加上一個view來改變狀態列顏色,這樣擷取的Bitmap最上方狀態列就不會是白色的了。親測是有效果的。