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

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

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

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

Java

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

Android

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

SDK

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

Android Studio

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

Q&A

0回答

287閲覧

Viewの回転後の座標の取得方法

24develop

総合スコア8

canvas

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

Java

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

Android

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

SDK

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

Android Studio

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

0グッド

0クリップ

投稿2018/10/12 06:44

編集2022/01/12 10:55

###【実現したい事】
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; } };

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問