ScaleGestureDetectorを使用したズームイン・アウトの初期画像を画面サイズにしたい

1,058 views
Skip to first unread message

elk

unread,
Dec 28, 2012, 11:14:11 AM12/28/12
to android-g...@googlegroups.com
お世話になります。
現在、ScaleGestureDetectorを使用して画像のズームイン・アウトのアプりを作成しています。
こちらのサイト(http://blog.livedoor.jp/moonlight_aska/archives/50660605.html)を参考にしながらソースを書いてみて問題なく動いたのですが、
元の画像が1200×2000ととても大きいため、初めにアプりを起動すると画像が大幅に飛び出してしまいます。
アプり起動時には画面の大きさにするには何処を変更すればよいでしょうか?
お手数ですが教えてください。
ほとんどサイトを流用していますが、ソースは以下になります。
お願いいたします。

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ViewGroup;
import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ScrollView;

public class UserGuide  extends Activity{
private static final int TOUCH_NONE   = 0;
private static final int TOUCH_SINGLE = 1;
private static final int TOUCH_MULTI  = 2;
private int touchMode = TOUCH_NONE;
private Matrix baseMatrix = new Matrix(); // タッチダウン時の画像保存用
private Matrix imgMatrix = new Matrix(); // 画像変換用
private PointF po0 = new PointF();   // 移動の開始点

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        MyView view = new MyView(this);
            setContentView(R.layout.userguide);
            setContentView(view);
    }
    class MyView extends ImageView {
    private ScaleGestureDetector gesDetect = null;

    public MyView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub


    setImageResource(R.drawable.userguide);
    setScaleType(ImageView.ScaleType.MATRIX);
    gesDetect = new ScaleGestureDetector(context, onScaleGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    int action = event.getAction() & MotionEvent.ACTION_MASK;
    int count = event.getPointerCount();
    moveFlag=1;

    // 移動
    switch(action) {
    case MotionEvent.ACTION_DOWN:
    if(touchMode == TOUCH_NONE && count == 1) {
    Log.v("touch", "DOWN");
    po0.set(event.getX(), event.getY());
    baseMatrix.set(imgMatrix);
    touchMode = TOUCH_SINGLE;
    }
    break;
    case MotionEvent.ACTION_MOVE:
    if(touchMode == TOUCH_SINGLE) {
    Log.v("touch", "MOVE");
    // 移動処理
    imgMatrix.set(baseMatrix);
    imgMatrix.postTranslate(event.getX() - po0.x, event.getY() - po0.y);
    }
    break;
    case MotionEvent.ACTION_UP:
    if(touchMode == TOUCH_SINGLE) {
    Log.v("touch", "UP");
    touchMode = TOUCH_NONE;
    }
    break;
    }
    if(count >= 2) {
    gesDetect.onTouchEvent(event);
    }
    setImageMatrix(imgMatrix);
    return true;
    }

    private final SimpleOnScaleGestureListener onScaleGestureListener = new SimpleOnScaleGestureListener() {

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
    // TODO Auto-generated method stub
    imgMatrix.set(baseMatrix);
    imgMatrix.postScale(detector.getScaleFactor(), detector.getScaleFactor(),
          detector.getFocusX(), detector.getFocusY());
    return super.onScale(detector);
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
    // TODO Auto-generated method stub
    Log.v("touch", "onScaleBegin");
    baseMatrix.set(imgMatrix);
    touchMode = TOUCH_MULTI;
    return super.onScaleBegin(detector);
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
    // TODO Auto-generated method stub
    Log.v("touch", "onScaleEnd");
    touchMode = TOUCH_NONE;
    super.onScaleEnd(detector);
    }
    };
    }
}

斉藤尚彦

unread,
Dec 28, 2012, 5:39:23 PM12/28/12
to android-g...@googlegroups.com

画面のサイズを、

キャンバスのサイズ取得してから、
適応させるんじゃないでしょうか…

下は他から引っ張ってきたサンプルですが。

      

package net.npaka.stringex;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

//文字列の描画
public class StringView extends View {
    //コンストラクタ
    public StringView(Context context) {
        super(context);
        setBackgroundColor(Color.WHITE);
    }

    //描画時に呼ばれる
    @Override
    protected void onDraw(Canvas canvas) {
        //描画オブジェクトの生成
        Paint paint=new Paint();     
        paint.setAntiAlias(true);//(1)
       
        //文字サイズと文字色の指定(2)
        paint.setTextSize(24);
        paint.setColor(Color.rgb(0,0,0));
       
        //画面サイズの取得(3)
        canvas.drawText("画面サイズ:"+
           getHeight getWidth()+"x"+(),0,60,paint);
       
        //文字幅の取得(4)
        canvas.drawText("文字幅:"+
            (int)paint.measureText("A"),0,60*2,paint);
       
        //アセント・ディセントの取得(5)
        canvas.drawText("アセント:"+
            (int)paint.ascent(),0,60*3,paint);
        canvas.drawText("ディセント:"+
            (int)paint.descent(),0,60*4,paint);
       
        //24ドットの文字列の表示(6)
        paint.setTextSize(24);
        paint.setColor(Color.rgb(255,0,0));
        canvas.drawText("24dot",0,60*5,paint);

        //32ドットの文字列の表示
        paint.setTextSize(32);
        paint.setColor(Color.rgb(0,255,0));
        canvas.drawText("32dot",0,60*6,paint);

        //48ドットの文字列の表示
        paint.setTextSize(48);
        paint.setColor(Color.rgb(0,0,255));
        canvas.drawText("48dot",0,60*7,paint);
    }
}

田代透

unread,
Dec 28, 2012, 6:59:55 PM12/28/12
to android-g...@googlegroups.com

android class screen size
で、ぐぐると幸せの欠片が見つかっかも

2012/12/29 1:14 "elk" <elkhe...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/android-group-japan/-/Mt1XnwBgf7wJ にアクセスしてください。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
Reply all
Reply to author
Forward
0 new messages