iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
0
Mobile Development

iOS Developer Learning Android系列 第 12

iOS Developer Learning Android. Lesson 12 - ImageView + ImagePicker (想知道如何把歪掉的照片調正嗎?)

  • 分享至 

  • xImage
  •  

想知道如何把歪掉的照片調正嗎?

故事是這樣的
這是一個再簡單不過的功能
有個頭像 > 點他 > 問你要上傳照片或拍照 > 更新頭像

但是...

Yes

安卓有些手機拍照之後角度會有點不太一樣

  1. 在手機上看是正的
  2. 角度是90度
  3. BUT事情往往不是憨人想得這麼簡單

那也就算了
每個人看事情的角度本來就不一樣
那我讀取它的角度再去轉可以吧?

拿到的exif不是null就是直接例外FileNotFoundException

詳細問題連結,如果能給小弟一點提示,那就功德無量


前情提要完畢

好吧
該做的事情還是要做
我們先來把基本的功能講完

對照表☘️☘️☘️

Android iOS
ImageView UIImageView
Bitmap UIImage

常用屬性與一些說明

  1. ImageView
    1. 圖片檔名連一個大寫都不能出現= =,不然就會build不起來⚠️⚠️⚠️
    2. scaleType就是以前的UIContentMode☘️☘️☘️
      1. UIViewContentModeScaleToFill = fitXY
      2. UIViewContentModeScaleAspectFit = fitCenter
      3. UIViewContentModeScaleAspectFill = centerCrop
    3. 如果元件是用拉的,可以選擇一些內建的圖片,害我暗爽以為有現成的素材可以用,原來只是參考用的,App跑起來是看不到的
    4. 圖片屬性放在app:srcCompat(android:src是舊的屬性,無法支援向量圖)

實作

  1. 先在畫面上拉個ImageView,然後再上面蓋個透明Button(background="@android:color/transparent")
    後來才知道,原來只要是View,就可以跟用戶交互,也不用開什麼userInterfaceEnable,直接給它OnClick下去就對了⚠️⚠️⚠️
  2. 點下去之後,根據不同的情況,啟用不同的Intent,
    這邊不會有一個專屬的類別(UIImagePickerController)去負責這件事⚠️⚠️⚠️
    public void changeAvatar(View view)
    {
        Dialog dialog = new AlertDialog.Builder(this)

            .setTitle("請選擇頭像來源")
            .setPositiveButton("相機", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                    startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),kCameraIntentRequestCode);
                }
            })
            .setNegativeButton("相簿", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent,kAlbumIntentRequestCode);
                }
            })
            .setNeutralButton("檔案", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                    intent.setType("*/*");
                    startActivityForResult(Intent.createChooser(intent, "Select Picture"), kFileIntentRequestCode);
                }
            })
            .create();

        dialog.show();
    }
  1. 只要那些Intent回來後,就會call onActivityResult
    此會有兩個code,requestCode是我們當初給它的,用來判斷是誰回來
    resultCode是判斷status
    不同的情況有不同圖片的取法...
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode != Activity.RESULT_OK || data == null)
        {
            return;
        }

        switch (requestCode)
        {
            case kCameraIntentRequestCode:
            {
                Bitmap bitmap = (Bitmap)data.getExtras().get("data");
                imageView.setImageBitmap(bitmap);
                break;
            }
            case kAlbumIntentRequestCode:
            case kFileIntentRequestCode:
            {
                ContentResolver contentResolver = this.getContentResolver();
                try
                {
                    Bitmap bmp = MediaStore.Images.Media.getBitmap(contentResolver,data.getData());
                    imageView.setImageBitmap(bmp); imageView.setImageBitmap(rotateBitmapByDegree(bmp,getBitmapDegree(data.getData().getPath())));
                }
                catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
                break;
            }
        }
    }

繼承關係

  1. ImageView
    java.lang.Object
    ↳ android.view.View
    ↳ android.widget.ImageView

我沒有安卓手機怎麼測拍照功能啊

人家安卓模擬器連這個都幫你想好了⚠️⚠️⚠️
不只能拍

還可以移動鏡頭

小彩蛋

補充個跟image完全沒關係的東西

  1. 有的時候我們會勾選,用同一個裝置或模擬器執行
  2. 但可能後來我們想換別台了,怎麼辦呢?
    先在右上角工具列的最左邊選Edit Config
  3. 然後就可以把使用相同裝置反勾了

參考資料

今天的範例程式

可以去 https://github.com/mark33699/IDLA 看一下順便給顆⭐️


如果你喜歡我的影片別忘了按讚分享加訂閱,開啟紅色的小鈴鐺,我們明天見~


上一篇
iOS Developer Learning Android. Lesson 11 - Button + Dialog (感受一下使用原生鏈式編程彈出Alert吧)
下一篇
iOS Developer Learning Android. Lesson 13 - Spinner + DatePickerDialog (UIPickerView的代替品:下拉選單)
系列文
iOS Developer Learning Android30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言