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

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

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

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

Android

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

Android Studio

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

Q&A

1回答

2055閲覧

Androidアプリで表示する画像はそのままで表示範囲の縦幅を変更したい。

W.Taka

総合スコア31

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/01/19 07:40

この指定した画像を拡大縮小スクロールできるプログラムで、表示する画像の幅などを変えずに、表示する範囲を変更したいです。
Xmlで高さなどを変更したのですが反映されないみたいなのですが、どのように変更すればよろしいでしょうか?

Android

1package com.example.admin.scrollimage1; 2 3import android.annotation.SuppressLint; 4import android.content.Context; 5import android.content.res.Resources; 6import android.graphics.Bitmap; 7import android.graphics.BitmapFactory; 8import android.graphics.Canvas; 9import android.graphics.Paint; 10import android.graphics.Point; 11import android.graphics.PointF; 12import android.graphics.Rect; 13import android.support.v4.widget.DrawerLayout.LayoutParams; 14import android.util.AttributeSet; 15import android.util.Pair; 16import android.view.MotionEvent; 17import android.view.View; 18import android.view.View.OnTouchListener; 19 20public class ZoomImageView extends View implements OnTouchListener { 21 22 private final String ANDROID_NAMESPACE = "http://schemas.android.com/apk/res/android"; 23 private final int DRAW_MODE_FIT = 0; 24 private final int DRAW_MODE_MAX = 1; 25 private final int DRAW_MODE_MIN = 2; 26 private Context context; 27 private Bitmap bitmap; 28 private Paint paint; 29 private Rect rect; 30 private int layoutWidthParam = 0; 31 private int oldPointsDistance, viewLength, viewWidth, viewHeight, drawMode; 32 private int doubleTapDuration = 300; 33 private float scale = 1F; 34 private float maxScale = 2F; 35 private float minScale = 0.5F; 36 private Pair<Long, Long> actionDownTimes; 37 38 public ZoomImageView(Context c) { 39 super(c); 40 context = c; 41 init(); 42 } 43 44 public ZoomImageView(Context c, AttributeSet attrs){ 45 super(c,attrs); 46 context = c; 47 init(); 48 49 int layoutWidthParam = attrs.getAttributeIntValue(ANDROID_NAMESPACE, "layout_width", 0); 50 setWidth(layoutWidthParam); 51 int srcResourceId = attrs.getAttributeResourceValue(ANDROID_NAMESPACE, "src", 0); 52 53 if(srcResourceId > 0) { 54 55 setImageResourceId(srcResourceId); 56 57 } 58 59 } 60 61 public void setWidth(int width) { 62 63 layoutWidthParam = width; 64 65 } 66 67 private void init() { 68 69 rect = new Rect(); 70 paint = new Paint(); 71 actionDownTimes = new Pair<Long, Long>(0L, 0L); 72 setOnTouchListener(this); 73 74 } 75 76 public void setImageBitmap(Bitmap bm) { 77 78 bitmap = bm; 79 refresh(); 80 81 } 82 83 public void setImageResourceId(int resourceId) { 84 85 Resources resources = context.getResources(); 86 bitmap = BitmapFactory.decodeResource(resources, resourceId); 87 refresh(); 88 89 } 90 91 public Rect getImageRect() { 92 93 return rect; 94 95 } 96 97 public float getImageScale() { 98 99 return scale; 100 101 } 102 103 public Point getImagePoint() { 104 105 return new Point(bitmapX, bitmapY); 106 107 } 108 109 public void setMaxScale(float scale) { 110 111 maxScale = scale; 112 113 } 114 115 public void setMinScale(float scale) { 116 117 minScale = scale; 118 119 } 120 121 public void setDoubleTapDuration(int duration) { 122 123 doubleTapDuration = duration; 124 125 } 126 127 private void refresh() { 128 129 bitmapX = bitmapY = 0; 130 scale = 1F; 131 132 } 133 134 private int bitmapX = 0; 135 private int bitmapY = 0; 136 private float oldX = 0; 137 private float oldY = 0; 138 private float lastMultiX = 0; 139 private float lastMultiY = 0; 140 141 @Override 142 public boolean onTouch(View v, MotionEvent event) { 143 144 int pointCount = event.getPointerCount(); 145 float x = event.getRawX(); 146 float y = event.getRawY(); 147 148 if(oldX == 0 && oldY == 0) { 149 150 oldX = x; 151 oldY = y; 152 153 } 154 155 if(lastMultiX != 0 || lastMultiY != 0) { 156 157 x = x - (x - lastMultiX); 158 y = y - (y - lastMultiY); 159 160 } 161 162 switch(event.getAction()) { 163 164 case MotionEvent.ACTION_MOVE: 165 166 if(pointCount == 1) { 167 168 bitmapX += (int) (x - oldX); 169 bitmapY += (int) (y - oldY); 170 171 clearPinchDistance(); 172 173 } else if(pointCount == 2) { 174 175 int pointsdefference = getPointsDifference( 176 new PointF(event.getX(0), event.getY(0)), 177 new PointF(event.getX(1), event.getY(1)) 178 ); 179 180 if(oldPointsDistance == 0) { 181 182 oldPointsDistance = pointsdefference; 183 184 } 185 186 float moveDifference = (pointsdefference - oldPointsDistance); 187 scale += moveDifference / viewLength; 188 oldPointsDistance = pointsdefference; 189 190 if(scale < minScale) { 191 192 scale = minScale; 193 194 } 195 196 } else { 197 198 clearPinchDistance(); 199 200 } 201 202 invalidate(); 203 break; 204 205 case MotionEvent.ACTION_POINTER_UP: 206 lastMultiX = x; 207 lastMultiY = y; 208 break; 209 210 case MotionEvent.ACTION_UP: 211 clearLastMultiXY(); 212 213 long firstTime = actionDownTimes.first; 214 long secondTime = actionDownTimes.second; 215 216 if(firstTime > 0 && secondTime > 0 217 && (secondTime-firstTime) < doubleTapDuration 218 && (System.currentTimeMillis()-secondTime) < doubleTapDuration) { 219 220 onDoubleTap(); 221 invalidate(); 222 223 } 224 225 break; 226 227 case MotionEvent.ACTION_DOWN: 228 clearLastMultiXY(); 229 actionDownTimes = new Pair<Long, Long>(actionDownTimes.second, System.currentTimeMillis()); 230 break; 231 232 } 233 234 oldX = x; 235 oldY = y; 236 return true; 237 } 238 239 private void clearPinchDistance() { 240 241 oldPointsDistance = 0; 242 243 } 244 245 private void clearLastMultiXY() { 246 247 lastMultiX = lastMultiY = 0; 248 249 } 250 251 private int getPointsDifference(PointF point1, PointF point2) { 252 253 return (int) Math.sqrt((point2.x - point1.x) * (point2.x - point1.x) + (point2.y - point1.y) * (point2.y - point1.y)); 254 255 } 256 257 @SuppressLint("DrawAllocation") 258 @Override 259 protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){ 260 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 261 262 int measureWidth = MeasureSpec.getSize(widthMeasureSpec); 263 264 int bitmapWidth = bitmap.getWidth(); 265 int bitmapHeight = bitmap.getHeight(); 266 267 if(layoutWidthParam == LayoutParams.MATCH_PARENT || bitmapWidth > measureWidth) { 268 269 float ratio = (float)bitmapHeight / (float)bitmapWidth; 270 viewWidth = measureWidth; 271// viewHeight = (int) ((float)viewWidth * ratio); 272 viewHeight = (int) ((float)viewWidth * ratio); 273 if(bitmapWidth > measureWidth) { 274 275 bitmap = Bitmap.createScaledBitmap(bitmap, viewWidth, viewHeight, false); 276 277 } 278 279 } else { 280 281 viewWidth = bitmapWidth; 282 viewHeight = bitmapHeight; 283 284 } 285 286 viewLength = (int) (((float)viewWidth + (float)viewHeight) / 2F); 287 setMeasuredDimension(viewWidth, viewHeight); 288 289 } 290 291 @Override 292 protected void onDraw(Canvas canvas) { 293 super.onDraw(canvas); 294 295 float correctedWidth = viewWidth * scale - viewWidth; 296 float correctedHeight =viewHeight * scale - viewHeight; 297 int correctedWidthHalf = 0; 298 int correctedHeightHalf = 0; 299 300 if(correctedWidth != 0) { 301 302 correctedWidthHalf = (int) (correctedWidth / 2); 303 304 } 305 306 if(correctedHeight != 0) { 307 308 correctedHeightHalf = (int) (correctedHeight / 2); 309 310 } 311 312 int startX1 = bitmapX - correctedWidthHalf; 313 int startY1 = bitmapY - correctedHeightHalf; 314 int startX2 = canvas.getWidth() + bitmapX + correctedWidthHalf; 315 int startY2 = canvas.getHeight() + bitmapY + correctedHeightHalf; 316 rect.set(startX1, startY1, startX2, startY2); 317 canvas.drawBitmap(bitmap, null, rect, paint); 318 319 } 320 321 private void onDoubleTap() { 322 323 switch (drawMode) { 324 325 case DRAW_MODE_FIT: 326 bitmapX = bitmapY = 0; 327 scale = 1F; 328 break; 329 case DRAW_MODE_MAX: 330 scale = maxScale; 331 break; 332 case DRAW_MODE_MIN: 333 scale = minScale; 334 break; 335 default: 336 break; 337 338 } 339 340 drawMode++; 341 342 if(drawMode > DRAW_MODE_MIN) { 343 344 drawMode = 0; 345 346 } 347 348 } 349 350 351 352 353 354} 355/***Sample 356 357 // Xml 358 359 <com.sukohi.lib.ZoomImageView 360 android:layout_width="match_parent" 361 android:layout_height="wrap_content" 362 android:src="@drawable/drawable" 363 android:background="@color/black" /> 364 365 366 // Code 367 368 ZoomImageView zoomImageView = (ZoomImageView) findViewById(R.id.zoomimageview); 369 zoomImageView.setImageResourceId(R.drawable.drawable); // or setImageBitmap(bitmap); 370 zoomImageView.setMaxScale(5F); // skippable(Default:2F) 371 zoomImageView.setMinScale(0.1F); // skippable(Default:0.5F) 372 373 zoomImageView.getImageRect(); // Get image Rect 374 zoomImageView.getImageScale(); // Get image scale 375 zoomImageView.getImagePoint(); // Get image Point 376 377***/ 378 379

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

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

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

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

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

guest

回答1

0

onDraw内でBitmapを描画している、drawBitmapの第3引数の内容を変更すれば動きますよ。
例えば、縦方向に移動したい場合はstartY1とstartY2に同じ値を足したり引いたりすると動くとおもいますよ。

投稿2017/01/19 13:45

yona

総合スコア18155

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

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

W.Taka

2017/01/23 05:40

すみません説明不足でした。 簡単に言うとビューの位置を下のほうに移動させてビューのサイズを変更したいと考えているのですが。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問