web-dev-qa-db-ja.com

Android:Imageviewのスクロール

Normale画面の高さの2倍(960ディップ)のImageViewがあります。画面上で上下にきれいにスクロールしたいと思います。画面の下部にボタンが含まれている必要があります。 ScrollViewとImageviewsのさまざまな組み合わせを試しましたが、成功しませんでした。また、結果なしで:isScrollContainer属性を考えました。誰もこれを行う方法を知っていますか?乾杯、ルカ

24
luca

@ cV2そのコードをありがとう。必要な方向に進んでくれました。これは、画像の端でスクロールを停止する修正版です...

    // set maximum scroll amount (based on center of image)
    int maxX = (int)((bitmapWidth / 2) - (screenWidth / 2));
    int maxY = (int)((bitmapHeight / 2) - (screenHeight / 2));

    // set scroll limits
    final int maxLeft = (maxX * -1);
    final int maxRight = maxX;
    final int maxTop = (maxY * -1);
    final int maxBottom = maxY;

    // set touchlistener
    ImageView_BitmapView.setOnTouchListener(new View.OnTouchListener()
    {
        float downX, downY;
        int totalX, totalY;
        int scrollByX, scrollByY;
        public boolean onTouch(View view, MotionEvent event)
        {
            float currentX, currentY;
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    downX = event.getX();
                    downY = event.getY();
                    break;

                case MotionEvent.ACTION_MOVE:
                    currentX = event.getX();
                    currentY = event.getY();
                    scrollByX = (int)(downX - currentX);
                    scrollByY = (int)(downY - currentY);

                    // scrolling to left side of image (pic moving to the right)
                    if (currentX > downX)
                    {
                        if (totalX == maxLeft)
                        {
                            scrollByX = 0;
                        }
                        if (totalX > maxLeft)
                        {
                            totalX = totalX + scrollByX;
                        }
                        if (totalX < maxLeft)
                        {
                            scrollByX = maxLeft - (totalX - scrollByX);
                            totalX = maxLeft;
                        }
                    }

                    // scrolling to right side of image (pic moving to the left)
                    if (currentX < downX)
                    {
                        if (totalX == maxRight)
                        {
                            scrollByX = 0;
                        }
                        if (totalX < maxRight)
                        {
                            totalX = totalX + scrollByX;
                        }
                        if (totalX > maxRight)
                        {
                            scrollByX = maxRight - (totalX - scrollByX);
                            totalX = maxRight;
                        }
                    }

                    // scrolling to top of image (pic moving to the bottom)
                    if (currentY > downY)
                    {
                        if (totalY == maxTop)
                        {
                            scrollByY = 0;
                        }
                        if (totalY > maxTop)
                        {
                            totalY = totalY + scrollByY;
                        }
                        if (totalY < maxTop)
                        {
                            scrollByY = maxTop - (totalY - scrollByY);
                            totalY = maxTop;
                        }
                    }

                    // scrolling to bottom of image (pic moving to the top)
                    if (currentY < downY)
                    {
                        if (totalY == maxBottom)
                        {
                            scrollByY = 0;
                        }
                        if (totalY < maxBottom)
                        {
                            totalY = totalY + scrollByY;
                        }
                        if (totalY > maxBottom)
                        {
                            scrollByY = maxBottom - (totalY - scrollByY);
                            totalY = maxBottom;
                        }
                    }

                    ImageView_BitmapView.scrollBy(scrollByX, scrollByY);
                    downX = currentX;
                    downY = currentY;
                    break;

            }

            return true;
        }
    });

私はそれが少し洗練される可能性があると確信していますが、それはかなりうまく機能します。 :)

33
wirbly

私はこのコードをずっと探していたので、この素晴らしいコードの平和を共有したかったのです。

このコードは、バックエンドにxmlファイルを持つアクティビティからのものです含む an ImageView 'img'と呼ばれます

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:id="@+id/img"
    Android:scaleType="center"
    Android:background="#fff"
    Android:src="@drawable/picName"
/>

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.xml_name_layout);

    final ImageView switcherView = (ImageView) this.findViewById(R.id.img);

    switcherView.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View arg0, MotionEvent event) {

            float curX, curY;

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:
                    mx = event.getX();
                    my = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    curX = event.getX();
                    curY = event.getY();
                    switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
                    mx = curX;
                    my = curY;
                    break;
                case MotionEvent.ACTION_UP:
                    curX = event.getX();
                    curY = event.getY();
                    switcherView.scrollBy((int) (mx - curX), (int) (my - curY));
                    break;
            }

            return true;
        }
    });

}

私のために完璧に仕事をしました... 水平および垂直スクロールを含む(有効)

マイナス面は...画像の端をスクロールできますが...これは私にとっては問題ありません。そして、この機能を簡単に実装することができます:)

がんばって

28
cV2

これは私がそれを修正した方法です:p

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:scrollbarAlwaysDrawVerticalTrack="true" >

<ImageView
    Android:contentDescription="Specs"
    Android:adjustViewBounds="true"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:scrollbars="vertical"
    Android:src="@drawable/specs" >
</ImageView>
17
frapeti

@wirblyあなたのコードを本当にありがとう、それは私が望むように正確に動作します。しかし、最初にコードを読んだとき、定義を忘れていた4つの変数について少し混乱しました。

だから、私はそれを明確にするためにコードの定義を追加したい。

Resources res=getResources();
Bitmap mBitmap = BitmapFactory.decodeResource(res, R.drawable.p_1920x1080); 
BitmapDrawable bDrawable = new BitmapDrawable(res, mBitmap);

//get the size of the image and  the screen
int bitmapWidth = bDrawable.getIntrinsicWidth();
int bitmapHeight = bDrawable.getIntrinsicHeight();
int screenWidth = this.getWindowManager().getDefaultDisplay().getWidth();  
int screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();

役に立てば幸いです。

8
hukeping

最も簡単な方法は、webviewを使用して、ローカルのhtmlファイルを介して画像を読み込むことです。この方法では、ズームコントロールを使用する場合に自動的に取得することもできます。大きな画像の場合(幅が1000または3000ピクセルの場合)、Android(Coliris)は、元の画像がシャープで非圧縮)。これは既知の問題です。そのための解決策は、大きな画像を小さなタイルに分割し、html(divまたはテーブル)を介してそれらを再びまとめることです。このアプローチを使用して、地下鉄の地図(画面より大きくスクロール可能)をユーザーに提供します。

    WebView webView = (WebView)findViewById(R.id.webView);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);

    webView.loadUrl( "content://com.myapp.Android.localfile/sdcard/myappdata/common/mtr_map.html");

これは、特定のケースに依存しますが、ほとんどの場合/「通常のアプリ」で機能する可能性があります。ゲームのスクロール可能な背景として画像について話している場合、それは役に立たないかもしれません。

Htmlファイルの代わりに、画像(png、jpg)を直接読み込むこともできます。ズームコントロールが必要ない場合は、オフにします。

6
Mathias Conradt

別の方法は、HorizontalScrollViewを作成し、それにimageViewを追加してから、HorizontalScrollViewScrollViewに追加することです。これにより、上、下、左、右にスクロール

2
Mr X

わたしにはできる

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:padding="10dp">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

        <ImageView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:src="@drawable/img"
            Android:scaleType="centerCrop"
            Android:adjustViewBounds="true"/>

        <Button
            style="@style/btn"
            Android:id="@+id/btn"
            Android:layout_height="60dp"
            Android:layout_marginTop="20dp"
            Android:background="@drawable/btn"
            Android:onClick="click"
            Android:text="text" />
    </LinearLayout>

</ScrollView>
1
Liena

xさんが上記のように簡単で100%信頼できるソリューションを見つけた(言及した他のコードは一部のデバイスで動作しなかったり壊れたりしたため)Androidで提供されるScrollViewを使用すると、ものの世話

このようなもの

<ScrollView Android:layout_width="fill_parent" Android:id="@+id/scrollView1"
        Android:layout_height="wrap_content" Android:layout_alignParentTop="true"
        Android:layout_alignParentLeft="true" Android:layout_above="@+id/button1"
        Android:layout_alignParentRight="true" Android:scrollbarAlwaysDrawVerticalTrack="true">
        <LinearLayout Android:id="@+id/linearLayout1"
            Android:layout_width="fill_parent" Android:layout_height="fill_parent" Android:gravity="center_horizontal">
            <ImageView Android:src="@Android:drawable/ic_menu_report_image"
                Android:layout_height="wrap_content" Android:id="@+id/imageView1"
                Android:layout_width="wrap_content"></ImageView>
        </LinearLayout>
    </ScrollView>

そして、このようなものをoncreateで

if (mImageName != null) {
        InputStream is = null;
        try {
            is = this.getResources().getAssets().open("mathematics/"+mImageName);
        } catch (IOException e) {
        }
        Bitmap image = BitmapFactory.decodeStream(is);

        mImageView.setImageBitmap(image);
}

乾杯!

0
neelabh