Android音影片開發基礎(一) : 通過三種方式(ImageView,SurfaceView,自定義View)繪製圖片
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)繪製圖片