私のアプリには、ギャラリーから画像を選択し、画像をビューに設定するボタンがあります。しかし、ここでの問題は、ボタンをクリックするとギャラリーに何度も移動することです。gallery から画像を選択した場合と同様に、ギャラリーから画像を選択するように再度求められます。これが 4 ~ 5 回発生し、画像がカスタムビューに設定されます。毎回同じ問題
ギャラリーから画像を選択する私のコードは次のとおりです。ビューをダブルタップすると、ギャラリーが開いて画像を選択します。これは複数のビュー用です。各ビューは、ギャラリーからの異なる画像で設定する必要があります。だから私はこの方法を使用します。
static void tapped1(Context context, int requestCode){
((Activity) context).startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), 1);
}
static void tapped2(Context context, int requestCode){
((Activity) context).startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), 2);
}
static void tapped3(Context context, int requestCode){
((Activity) context).startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), 3);
}
static void tapped4(Context context, int requestCode){
((Activity) context).startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), 4);
}
static void tapped5(Context context, int requestCode){
((Activity) context).startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), 5);
}
次に、得られる結果は次のとおりです
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if(requestCode==1){
reset();
imageURI = data.getData();
try {
Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI);
PanView.imageBitmap=b;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PanView.invalidate();
}
if(requestCode==2){
reset();
imageURI = data.getData();
try {
Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI);
PanView1.imageBitmap=b;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PanView1.invalidate();
}
if(requestCode==3){
reset();
imageURI = data.getData();
try {
Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI);
PanView2.imageBitmap=b;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PanView2.invalidate();
}
if(requestCode==4){
reset();
imageURI = data.getData();
try {
Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI);
PanView3.imageBitmap=b;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PanView3.invalidate();
}
if(requestCode==5){
reset();
imageURI = data.getData();
try {
Bitmap b = android.provider.MediaStore.Images.Media.getBitmap(getContentResolver(), imageURI);
PanView4.imageBitmap=b;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PanView4.invalidate();
}
} else {
System.exit(0);
Log.e("result", "BAD");
}
}
ontouch メソッドで customview クラスの tapped メソッドを呼び出しています。
私のオンタッチ方法は次のとおりです
public boolean onTouchEvent(MotionEvent ev) {
// If we are not supporting either zoom or pan, return early.
if (!mSupportsZoom && !mSupportsPan) return false;
// Let the ScaleGestureDetector inspect all events.
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
if ( Math.abs(mDeBounce - ev.getEventTime()) < 150) {
//Ignore if it's been less then 250ms since
//the item was last clicked
((PhotoCollageActivity) mContext).tapped1(this.getContext(), 1);
return true;
}
int intCurrentY = Math.round(ev.getY());
int intCurrentX = Math.round(ev.getX());
int intStartY = ev.getHistorySize() > 0 ? Math.round(ev.getHistoricalY(0)) : intCurrentY;
int intStartX = ev.getHistorySize() > 0 ? Math.round(ev.getHistoricalX(0)) : intCurrentX;
if ( (ev.getAction() == MotionEvent.ACTION_UP) && (Math.abs(intCurrentX - intStartX) < 3) && (Math.abs(intCurrentY - intStartY) < 3) ) {
// if ( mDeBounce > ev.getDownTime() ) {
//Still got occasional duplicates without this
//Handle the click
mDeBounce = ev.getEventTime();
return true;
}
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final int CONST = 5;
final float x = ev.getX();
final float y = ev.getY();
mLastTouchX = x;
mLastTouchY = y;
mLastTouchXMax = x+CONST; //here i get x and y values in action down
mLastTouchXMin = x-CONST;
mLastTouchYMax = y+CONST;
mLastTouchYMin = y-CONST;
mActivePointerId = ev.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
// Only move if the view supports panning and
// ScaleGestureDetector isn't processing a gesture.
if (mSupportsPan && !mScaleDetector.isInProgress()) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
//mFocusX = mPosX;
//mFocusY = mPosY;
invalidate();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
final float x = ev.getX();
final float y = ev.getY();
touchupX=x;
touchupY=y;
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
ここで私が間違っていることを教えてください。ありがとうございました