2015-01-06 52 views
1

經過長時間的攝影意圖苦苦掙扎之後,我現在終於通過使用SurfaceView和Camera api爲我的應用程序創建了自定義相機體驗。這非常棒,因爲我現在可以完全控制圖片拍攝體驗。我也想控制畫廊的體驗。我不清楚我該怎麼做?有什麼建議?基本上我希望下面的用戶體驗上的畫廊按鈕Android中的自定義畫廊裁剪窗口

  1. 點擊您的畫廊瀏覽照片
  2. 選擇從畫廊
  3. 照片選定的照片在自定義的預覽顯示了用戶在其中可以移動照片以選擇要使用的部分。請注意,這是一種發生在固定區域內的裁剪(在我的情況下,是手機寬度的大小):不允許調整大小;窗口內的圖片區域是使用的區域。絕大多數的社交媒體應用都是這樣做的。我只是不知道他們如何管理預覽/編輯窗口。

我所知道的,到目前爲止:

  1. 我仍然可以使用畫廊意圖,讓用戶選擇圖像
  2. 的部分我在哪裏卡住是如何創建自定義編輯體驗讓用戶選擇要顯示的圖像區域(固定大小的正方形)。再次,這不是調整種植;而是用戶可以移動圖像來選擇哪個子區域適合窗口。

感謝您的任何意見

+0

等待如何實現第二生病後完整的代碼示例你想要 – BiggDawgg

回答

1

確定在這裏,我們走!

活動從圖庫中選擇圖像。

import java.io.File; 
import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.util.Log; 

public class GalleryUtil extends Activity{ 
    private final static int RESULT_SELECT_IMAGE = 100; 
    public static final int MEDIA_TYPE_IMAGE = 1; 
    private static final String TAG = "GalleryUtil"; 

    String mCurrentPhotoPath; 
    File photoFile = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     try{ 
      //Pick Image From Gallery 
      Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(i, RESULT_SELECT_IMAGE); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     switch(requestCode){ 
     case RESULT_SELECT_IMAGE: 

      if (resultCode == Activity.RESULT_OK && data != null && data.getData() != null) { 
       try{ 
       Uri selectedImage = data.getData(); 
       String[] filePathColumn = {MediaStore.Images.Media.DATA }; 
       Cursor cursor = getContentResolver().query(selectedImage, 
         filePathColumn, null, null, null); 
       cursor.moveToFirst(); 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String picturePath = cursor.getString(columnIndex); 
       cursor.close(); 

       //return Image Path to the Main Activity 
       Intent returnFromGalleryIntent = new Intent(); 
       returnFromGalleryIntent.putExtra("picturePath",picturePath); 
       setResult(RESULT_OK,returnFromGalleryIntent);  
       finish(); 
       }catch(Exception e){ 
        e.printStackTrace(); 
        Intent returnFromGalleryIntent = new Intent(); 
        setResult(RESULT_CANCELED, returnFromGalleryIntent);  
        finish(); 
       } 
      }else{ 
       Log.i(TAG,"RESULT_CANCELED");  
       Intent returnFromGalleryIntent = new Intent(); 
       setResult(RESULT_CANCELED, returnFromGalleryIntent);  
       finish(); 
      } 
      break; 
     } 
    } 
} 

活動要裁剪選定的圖像:

public class ImageSelecter extends Activity{ 

    private final int GALLERY_ACTIVITY_CODE=200; 
    private final int RESULT_CROP = 400; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     btn_choose.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //Start Activity To Select Image From Gallery 
       Intent gallery_Intent = new Intent(getApplicationContext(), GalleryUtil.class); 
       startActivityForResult(gallery_Intent, GALLERY_ACTIVITY_CODE); 
       break; 
      } 
     }); 

    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == GALLERY_ACTIVITY_CODE) { 
      if(resultCode == Activity.RESULT_OK){ 
       picturePath = data.getStringExtra("picturePath"); 
       //perform Crop on the Image Selected from Gallery 
       performCrop(picturePath); 
      } 
     } 

     if (requestCode == RESULT_CROP) { 
      if(resultCode == Activity.RESULT_OK){ 
       Bundle extras = data.getExtras(); 
       Bitmap selectedBitmap = extras.getParcelable("data"); 
       // Set The Bitmap Data To ImageView 
       image_capture1.setImageBitmap(selectedBitmap);        
       image_capture1.setScaleType(ScaleType.FIT_XY); 
      } 
     } 
    } 

    private void performCrop(String picUri) { 
     try { 
      //Start Crop Activity 

      Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
      // indicate image type and Uri 
      File f = new File(picUri); 
      Uri contentUri = Uri.fromFile(f); 

      cropIntent.setDataAndType(contentUri, "image/*"); 
      // set crop properties 
      cropIntent.putExtra("crop", "true"); 
      // indicate aspect of desired crop 
      cropIntent.putExtra("aspectX", 1); 
      cropIntent.putExtra("aspectY", 1); 
      // indicate output X and Y 
      cropIntent.putExtra("outputX", 280); 
      cropIntent.putExtra("outputY", 280); 

      // retrieve data on return 
      cropIntent.putExtra("return-data", true); 
      // start the activity - we handle returning in onActivityResult 
      startActivityForResult(cropIntent, RESULT_CROP); 
     } 
     // respond to users whose devices do not support the crop action 
     catch (ActivityNotFoundException anfe) { 
      // display an error message 
      String errorMessage = "your device doesn't support the crop action!"; 
      Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    } 

這一切希望這會給你一個頭了:)

+0

非常感謝。我正在研究它。 –

+0

感謝您的回覆。你展示的是我已經擁有的畫廊。問題是用戶可以自由決定圖像的面積(h * w)。我不想給用戶這樣的自由。我需要類似於iOS的東西,其中裁剪窗口的區域設置爲石頭,並且用戶必須移動圖像以使所需的部分在窗口內可見。你知道我該怎麼做嗎? +1幫助。 –

+0

哦,我看到是的類似,你可以實現,不調用默認的作物,但創建自己的作物,並給它這個功能,我現在去我不能發佈完整的代碼,你可以搜索如何做到這一點,而我回到家,這裏是如何! – BiggDawgg