Android音視訊開發基礎(一) : 通過三種方式(ImageView,SurfaceView,自定義View)繪製圖片

語言: CN / TW / HK

highlight: atom-one-dark

前言

在Android音視訊開發中,網上知識點過於零碎,自學起來難度非常大,不過音視訊大牛Jhuster提出了《Android 音視訊從入門到提高 - 任務列表》。本文是Android音視訊任務列表的第一篇, 對應的要學習的內容是:在Android平臺繪製一張圖片,使用至少3種不同的 API,ImageView,SurfaceView,自定義View。


音視訊任務列表

音視訊任務列表: 點選此處跳轉檢視.


目錄

在這裡插入圖片描述


(一)ImageView繪製圖片

(1)將圖片分別放入mipmap-hdpi、assets

(2)佈局檔案:

```java

<ImageView
    android:id="@+id/iv_picture"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</ImageView>

```

(3)程式碼:

```java // ImageView載入幾種來源: // (1)drawable/mipmap中通過R.drawabe.xxx載入圖片資源 // (2)assests路徑的資源

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

    ImageView customImageView = findViewById(R.id.iv_picture);
    // 方式一:drawable/mipmap中通過R.drawabe.xxx載入圖片資源
    // customImageView.setBackgroundResource(R.mipmap.wuqian);

    // 方式二:載入assests路徑的資源
    customImageView.setImageBitmap(getImageFromAssetsFile(this, "lilangdi.jpg"));
}

public static Bitmap getImageFromAssetsFile(Context context, String fileName) {
    Bitmap image = null;
    AssetManager am = context.getResources().getAssets();
    try {
        InputStream is = am.open(fileName);
        image = BitmapFactory.decodeStream(is);
        is.close();
    } catch(IOException e) {
        e.printStackTrace();
    }
    return image;
}

} ```

(4)結果:

在這裡插入圖片描述


(二)SurfaceView繪製圖片

(1)將圖片放入手機資料夾內

(2)佈局:

```java

<SurfaceView
    android:id="@+id/sv_drawpicture"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</SurfaceView>

```

(3)新增許可權

java <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

(4)程式碼:

```java public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    verifyStoragePermissions(this);
    setContentView(R.layout.activity_main);

    SurfaceView mSurfaceView = findViewById(R.id.sv_drawpicture);

    mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            if (holder == null) {
                return;
            }

            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.STROKE);

            // 方式一:Environment.getExternalStorageDirectory().getPath()獲取路徑為:/storage/emulated/0
            // File.separator得到的是:/
            Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "wuqian.jpg");  // 獲取bitmap

            // 方式二:
            // Bitmap bitmap = BitmapFactory.decodeFile("/storage/emulated/0/wuqian.jpg");  // 獲取bitmap

            Canvas canvas = holder.lockCanvas();  // 先鎖定當前surfaceView的畫布
            canvas.drawBitmap(bitmap, 0, 0, paint); //執行繪製操作
            holder.unlockCanvasAndPost(canvas); // 解除鎖定並顯示在介面上
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }
    });

}

private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        "android.permission.READ_EXTERNAL_STORAGE",
        "android.permission.WRITE_EXTERNAL_STORAGE" };

public static void verifyStoragePermissions(Activity activity) {
    try {
        // 檢測是否有寫的許可權
        int permission = ActivityCompat.checkSelfPermission(activity,
                "android.permission.WRITE_EXTERNAL_STORAGE");
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 沒有寫的許可權,去申請寫的許可權,會彈出對話方塊
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} ```

(5)結果:

在這裡插入圖片描述


(三) 自定義View繪製圖片

(1)將圖片放入手機或者放入mipmap-hdpi

(2)佈局:

```java

<com.lzacking.viewdemo.CustomView
    android:id="@+id/customview"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.lzacking.viewdemo.CustomView>

```

(3)新增許可權

java <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

(4)程式碼:

CustomView: ```java public class CustomView extends View {

Paint paint = new Paint();
Bitmap bitmap;

public CustomView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.STROKE);
    // 方式一:從手機讀取圖片
    bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath() + File.separator + "kugou.png");  // 獲取bitmap

    // 方式二:從mipmap-hdpi讀取圖片
    // bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.taylor);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 不建議在onDraw做任何分配記憶體的操作
    if (bitmap != null) {
        canvas.drawBitmap(bitmap, 0, 0, paint);
    }
}

} **MainActivity:**java // 方式一:從手機讀取圖片 // 方式二:從mipmap-hdpi讀取圖片 public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 如果從手機讀取圖片,則需要申請許可權
    verifyStoragePermissions(this);
    setContentView(R.layout.activity_main);
}

private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        "android.permission.READ_EXTERNAL_STORAGE",
        "android.permission.WRITE_EXTERNAL_STORAGE" };

public static void verifyStoragePermissions(Activity activity) {
    try {
        // 檢測是否有寫的許可權
        int permission = ActivityCompat.checkSelfPermission(activity,
                "android.permission.WRITE_EXTERNAL_STORAGE");
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 沒有寫的許可權,去申請寫的許可權,會彈出對話方塊
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} ```

(5)結果:

在這裡插入圖片描述


原始碼: Android音視訊開發基礎(一) : 通過三種方式(ImageView,SurfaceView,自定義View)繪製圖片