7

私のホームオートメーションアプリには、ホームオートメーションソフトウェアを制御するために使用できるフロアプランとダッシュボードを備えた画像を携帯電話にアップロードできる機能があります。2つの画像をアップロードしてもらいます。1つは表示したいグラフィックを含む表示画像、もう1つは表示画像の対象領域に対応する単色のカラーマップです。両方の画像は、ピクセル単位で同じサイズである必要があります。彼らが画面をタップしたときに、カラーマップオーバーレイから色を取得できるようにしたいので、その色に関連付けられているアクションを実行します。問題は、画像の拡大縮小が私を台無しにしていることです。使用する画像はデバイスの画面よりも大きくなる可能性があるため、ディスプレイに収まるように拡大縮小します。今のところ、ズーム機能をピンチする必要はありません。しかし、後で実装するかもしれません。今のところ、画面に収まるように画像を最大サイズで表示したいだけです。だから、私の質問は、スケーリングされた画像から正しいタッチポイントの色を取得できるように、このコードをどのように変更できるかということです。画像スケーリング自体は正常に機能しているようです。スケーリングされ、正しく表示されます。正しいタッチポイントを取得できません。

 final Bitmap bm = decodeSampledBitmapFromFile(visible_image, size, size);
 if (bm!=null) {
    imageview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    imageview.setImageBitmap(bm);
 }

 final Bitmap bm2 = decodeSampledBitmapFromFile(image_overlay, size, size);
 if (bm2!=null) {
    overlayimageview.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    overlayimageview.setImageBitmap(bm2);

    imageview.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent mev) {
            DecodeActionDownEvent(v, mev, bm2);
            return false;
        }

    });
 }

 private void DecodeActionDownEvent(View v, MotionEvent ev, Bitmap bm2)
 {
    xCoord = Integer.valueOf((int)ev.getRawX());
    yCoord = Integer.valueOf((int)ev.getRawY());
    try {
        // Here's where the trouble is.
        // returns the value of the unscaled pixel at the scaled touch point?
        colorTouched = bm2.getPixel(xCoord, yCoord); 
    } catch (IllegalArgumentException e) {
        colorTouched = Color.WHITE; // nothing happens when touching white
    }
 }

 private static Bitmap decodeSampledBitmapFromFile(String fileName, 
         int reqWidth, int reqHeight) {
     // code from 
     // http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
     final BitmapFactory.Options options = new BitmapFactory.Options();
     options.inJustDecodeBounds = true;
     BitmapFactory.decodeFile(fileName, options);

     // Calculate inSampleSize
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

     // Decode bitmap with inSampleSize set
     options.inJustDecodeBounds = false;
     return BitmapFactory.decodeFile(fileName, options);
 }

 private static int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) {
     // code from 
     // http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
     // Raw height and width of image
     final int height = options.outHeight;
     final int width = options.outWidth;
     int inSampleSize = 1;

     if (height > reqHeight || width > reqWidth) {
       if (width > height) {
          inSampleSize = Math.round((float)height / (float)reqHeight);
       } else {
          inSampleSize = Math.round((float)width / (float)reqWidth);
       }
     }
     return inSampleSize;
 }
4

2 に答える 2

30

私はそれを考え出した。交換しました

 xCoord = Integer.valueOf((int)ev.getRawX());
 yCoord = Integer.valueOf((int)ev.getRawY());

 Matrix inverse = new Matrix();
 v.getImageMatrix().invert(inverse);
 float[] touchPoint = new float[] {ev.getX(), ev.getY()};
 inverse.mapPoints(touchPoint);
 xCoord = Integer.valueOf((int)touchPoint[0]);
 yCoord = Integer.valueOf((int)touchPoint[1]);
于 2012-09-19T15:58:30.123 に答える