質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

2331閲覧

Androidアプリでクリックリスナーは動くのですが、タッチイベントが動かないです

katushirou_p

総合スコア7

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/06/29 11:47

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)Androidプログラミング初心者です。
一番古いNEXUS7(Android6.0.1)にてカメラアプリを作成しております。
カメラアプリでタップした箇所にオートフォーカスをするようにしているのですが
ついでに、タップした箇所のx座標、y座標をとり、画面に表示したくプログラムを下記の用にしてみましたが
オートフォーカス機能は動いても、座標はとってくれませんでした。何か間違っている点ありましたらご教示して
いただけると幸いです。また、このようなサイトを利用するのは初めてなので、不手際があったらもうしわありません。

package com.example.sample; import java.io.ByteArrayOutputStream; import java.util.List; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.ImageFormat; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.YuvImage; import android.hardware.Camera; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { private SurfaceView mySurfaceView; private Camera myCamera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view); //SurfaceView mySurfaceView = (SurfaceView)findViewById(R.id.mySurfaceVIew); //リスナ追加 mySurfaceView.setOnClickListener(onSurfaceClickListener); //SurfaceHolder(SVの制御に使うInterface) SurfaceHolder holder = mySurfaceView.getHolder(); //コールバックを設定 holder.addCallback(callback); } //コールバック private SurfaceHolder.Callback callback = new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //CameraOpen myCamera = Camera.open(); //Portrait対応 myCamera.setDisplayOrientation(90); //出力をSurfaceViewに設定 try{ myCamera.setPreviewDisplay(surfaceHolder); }catch(Exception e){ e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int w, int h) { //最適サイズを取得 Camera.Parameters params = myCamera.getParameters(); List<Camera.Size> sizes = params.getSupportedPreviewSizes(); Camera.Size optimalSize = getOptimalPreviewSize(sizes,w,h); params.setPreviewSize(optimalSize.width,optimalSize.height); myCamera.setParameters(params); //プレビュースタート(Changedは最初にも1度は呼ばれる) myCamera.startPreview(); } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { //片付け myCamera.release(); myCamera = null; } }; public boolean onTouchEvent(MotionEvent event) { //X軸の取得 float pointX = event.getX(); //Y軸の取得 float pointY = event.getY(); //取得した内容をログに表示 Log.d("TouchEvent", "X:" + pointX + ",Y:" + pointY); TextView tv = (TextView)findViewById(R.id.textView2); tv.setText(Float.toString(pointX)); return true } //Surfaceをクリックした時 private View.OnClickListener onSurfaceClickListener = new View.OnClickListener(){ @Override public void onClick(View view){ if(myCamera != null){ //AutoFocusを実行 myCamera.autoFocus(autoFocusCallback); } } }; //AutoFocusした時 private Camera.AutoFocusCallback autoFocusCallback = new Camera.AutoFocusCallback(){ @Override public void onAutoFocus(boolean b, Camera camera) { //ただ写真を撮るだけならここにtakePicture()を入れても良い //しかし、Pixelを弄りたいのでもうワンクッション(画像処理やバーコード処理をしたいので) //Previewを1枚切り取る(そしてイベント発生) camera.setOneShotPreviewCallback(previewCallback); } }; //切り取った時(ここで撮影、各種画像処理を行う) private Camera.PreviewCallback previewCallback = new Camera.PreviewCallback(){ //OnShotPreview時のbyte[]が渡ってくる @Override public void onPreviewFrame(byte[] bytes, Camera camera) { //プレビューのフォーマットはYUVなので、YUVをBmpに変換する必要がある(ややこしい) int w = camera.getParameters().getPreviewSize().width; int h = camera.getParameters().getPreviewSize().height; //切り取った画像を保存 Bitmap bmp = getBitmapImageFromYUV(bytes, w, h); //回転 Matrix m = new Matrix(); m.setRotate(90); //保存用 bitmap生成 Bitmap rotated_bmp = Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),m,true); Bitmap save_bmp = Bitmap.createScaledBitmap(rotated_bmp, Init.pixelWidth, Init.pixelHeight, false); //保存 String res = MediaStore.Images.Media.insertImage(getContentResolver(),save_bmp,"",null); Log.v("tama","res="+res); Access acc = new Access(save_bmp); Thread t = new Thread(acc); t.start(); } }; //YUVをBitmapに変換する関数(参照:http://tech.thecoolblogs.com/2013/02/get-bitmap-image-from-yuv-in-android.html) public static Bitmap getBitmapImageFromYUV(byte[] data, int width, int height) { YuvImage yuvimage = new YuvImage(data, ImageFormat.NV21, width, height, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); yuvimage.compressToJpeg(new Rect(0, 0, width, height), 80, baos); byte[] jdata = baos.toByteArray(); BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options(); bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length, bitmapFatoryOptions); return bmp; } //ApiDemoでよく使うgetOptimalPreviewSize private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.1; double targetRatio=(double)h / w; if (sizes == null) return null; Camera.Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; for (Camera.Size size : sizes) { double ratio = (double) size.width / size.height; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Camera.Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }

アプローチとして各場所を
###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

メソッドに@overrideをつけてみてください。onTouchEventはViewのメソッドなのでエラーになるはずです。
View#setOnTouchListenerを使い、OnTouchListnenerを渡す必要があります。

投稿2016/06/29 12:43

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問