質問編集履歴

1 カスタムViewのコードを追記しました。(こちらのソースは広いものです。)

24develop

24develop score 0

2018/10/12 15:55  投稿

Viewの回転後の座標の取得方法
###【実現したい事】
Viewの回転後の座標について。
保持していた座標をしようし、SurfaceViewにbitmapとして埋め込みたい
###【詳細】
WillSDK
https://www.wacom.com/en-cn/enterprise/will
を使用し、描画アプリの開発を進めています。
WILLSDKでは、
android.graphics.Canvas
の劣化版のようなCanvasのクラスがあり、
そこにBitmap画像を書き込むことができます。
たとえば、WILLSDKを使用し、
横幅1400,高さ2000のキャンバスを作成したとします。
ここに、幅610、高さ300のbitmap画像を埋め込みたいとして、
埋め込み先の始点xを780とすると、
610 + 780 = 1390
なので、canvasの範囲内に収まり、描写が可能です。
しかし、画像を回転をしてしまうと(実際はviewを回転させ、回転後のViewの範囲を画像化しています?)、
横幅、bitmapの始点の位置含め、数値が変わってしまいますよね。
###【質問】
文章がまとまっていませんが、質問内容としましては
- 回転後の画像の正しい各数値(始点、終点、幅、高さ)はどうすれば取得できるのか
- WILLSDKに詳しい方にお聞きしたいのですが、bitmapを埋め込む際に、canvas範囲外を切り落として、Invalid position or dimensions.のエラーを発生させずに埋め込む方法はないか
上記2点についてお聞きしたいです。
正直自身の能力を超えていて泣きそうです。
というかこれってアプリ開発初心者が一人で取り組む内容なんでしょうか…。
投げたいです。
###【コード(抜粋)】
```
//ユーザーがSurfaceViewをタッチした際の判定
       surfaceView.setOnTouchListener((v, event) -> {
            /**
            プレビュー中は何も操作できない状態にする。
            */
           if(!PreviewingNowIs) {
               /**
                * * ステッカーの埋め込みを行うか最初に判定
                * まだCanvasに埋め込まれていないStickerが存在し(Viewの状態)ユーザーがステッカーの矩形範囲外をタップした場合にonRelease_○○○が呼ばれる。
         回転して斜めにないっている且つSurfaceView右端のほうにカスタムViewが置かれていた場合、onRelease_Stickerが起動し、surfaceViewに実際に画像を埋め込む際にInvaild Position Errorになる。
                */
               if (event.getAction() == MotionEvent.ACTION_DOWN) {
                   if (StickerView_tempoList.size() != 0) {
                       StickerImageView view = StickerView_tempoList.get(0);
                       if (!(view.getX() < 0) && !(view.getY() < 0) && !(view.getRight() + view.getX() > surfacewidth) && !(view.getBottom() + view.getY() > surfaceheight)) {
                           onRelease_Sticker(StickerView_tempoList.get(0), GROUP_ID_STICKER);
                           StickerView_tempoList.remove(0);
                       }
 
```  
 
 
 
```  
//カスタムViewクラス(抜粋)  
   private OnTouchListener mTouchListener = new OnTouchListener() {  
       @Override  
       public boolean onTouch(View view, MotionEvent event) {  
 
           if(view.getTag().equals("DraggableViewGroup")) {  
               switch (event.getAction()) {  
                   case MotionEvent.ACTION_DOWN:  
                       move_orgX = event.getRawX();  
                       move_orgY = event.getRawY();  
                       break;  
                   case MotionEvent.ACTION_MOVE:  
                       float offsetX = event.getRawX() - move_orgX;  
                       float offsetY = event.getRawY() - move_orgY;  
                       StickerView.this.setX(StickerView.this.getX()+offsetX);  
                       StickerView.this.setY(StickerView.this.getY() + offsetY);  
                       move_orgX = event.getRawX();  
                       move_orgY = event.getRawY();  
                       break;  
                   case MotionEvent.ACTION_UP:  
                       break;  
               }  
           }else if(view.getTag().equals("iv_scale")){  
               switch (event.getAction()) {  
                   case MotionEvent.ACTION_DOWN:  
 
                       this_orgX = StickerView.this.getX();  
                       this_orgY = StickerView.this.getY();  
 
                       scale_orgX = event.getRawX();  
                       scale_orgY = event.getRawY();  
                       scale_orgWidth = StickerView.this.getLayoutParams().width;  
                       scale_orgHeight = StickerView.this.getLayoutParams().height;  
 
                       rotate_orgX = event.getRawX();  
                       rotate_orgY = event.getRawY();  
 
                       centerX = StickerView.this.getX()+  
                               ((View)StickerView.this.getParent()).getX()+  
                               (float)StickerView.this.getWidth()/2;  
 
 
                       //double statusBarHeight = Math.ceil(25 * getContext().getResources().getDisplayMetrics().density);  
                       int result = 0;  
                       int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");  
                       if (resourceId > 0) {  
                           result = getResources().getDimensionPixelSize(resourceId);  
                       }  
                       double statusBarHeight = result;  
                       centerY = StickerView.this.getY()+  
                               ((View)StickerView.this.getParent()).getY()+  
                               statusBarHeight+  
                               (float)StickerView.this.getHeight()/2;  
 
                       break;  
                   case MotionEvent.ACTION_MOVE:  
 
                       rotate_newX = event.getRawX();  
                       rotate_newY = event.getRawY();  
                       //回転数  
                       double angle_diff = Math.abs(  
                               Math.atan2(event.getRawY() - scale_orgY , event.getRawX() - scale_orgX)  
                                       - Math.atan2(scale_orgY - centerY, scale_orgX - centerX))*180/Math.PI;  
 
 
                       double length1 = getLength(centerX, centerY, scale_orgX, scale_orgY);  
                       double length2 = getLength(centerX, centerY, event.getRawX(), event.getRawY());  
 
                       int size = convertDpToPixel(SELF_SIZE_DP, getContext());  
                       if(length2 > length1  
                               && (angle_diff < 25 || Math.abs(angle_diff-180)<25)  
                               ) {  
                           LOGD("xxxStickerViewsize", "everyrotatehascome?" );  
                           //scale up  
                           double offsetX = Math.abs(event.getRawX() - scale_orgX);  
                           double offsetY = Math.abs(event.getRawY() - scale_orgY);  
                           double offset = Math.max(offsetX, offsetY);  
                           offset = Math.round(offset);  
                           StickerView.this.getLayoutParams().width += offset;  
                           StickerView.this.getLayoutParams().height += offset;  
                           onScaling(true);  
                           StickerView.this.setX((float) (getX() - offset / 2));  
                           StickerView.this.setY((float) (getY() - offset / 2));  
 
                       }else if(length2 < length1  
                               && (angle_diff < 25 || Math.abs(angle_diff-180)<25)  
                               && StickerView.this.getLayoutParams().width > size/2  
                               && StickerView.this.getLayoutParams().height > size/2) {  
                           //scale down  
                           double offsetX = Math.abs(event.getRawX() - scale_orgX);  
                           double offsetY = Math.abs(event.getRawY() - scale_orgY);  
                           double offset = Math.max(offsetX, offsetY);  
                           offset = Math.round(offset);  
                           StickerView.this.getLayoutParams().width -= offset;  
                           StickerView.this.getLayoutParams().height -= offset;  
                           onScaling(false);  
                       }  
 
                       //rotate  
                       double angle = Math.atan2(event.getRawY() - centerY, event.getRawX() - centerX) * 180 / Math.PI;  
 
                       //setRotation((float) angle - 45);  
                       setRotation((float) angle - 45);  
 
                       onRotating();  
 
                       rotate_orgX = rotate_newX;  
                       rotate_orgY = rotate_newY;  
 
                       scale_orgX = event.getRawX();  
                       scale_orgY = event.getRawY();  
 
                       postInvalidate();  
                       requestLayout();  
 
                       LOGD("xxxStickerViewsize", "view.getX()=" + StickerView.this.getX() + "view.getY()=" +StickerView.this.getY() );  
 
                       break;  
                   case MotionEvent.ACTION_UP:  
                       break;  
               }  
           }  
           return true;  
       }  
   };  
```
  • Java

    15834 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    7301 questions

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

  • canvas

    312 questions

    HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

  • SDK

    148 questions

    SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

  • Android Studio

    4300 questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る