0

View.setScaleX()メソッドとView.setScaleY()メソッドを使用してviewサイズを小さくした後、結果には既に表示されているコンテンツのみが表示され、ズームインしたときに画面に収まらなかった残りの部分は除外されます。残りの部分を強制的に表示するにはどうすればよいですかコンテンツ?

XML: activity_main.xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/table"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

JAVA: MainActivity.java

package com.example.zoom;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TableLayout table = (TableLayout) findViewById(R.id.table);

        int textViewSize = 100;
        int tableColCount = 15;
        int tableRowCount = 15;

        for (int row = 0; row < tableRowCount; row++) {
            TableRow tr = new TableRow(this);
            for (int col = 0; col < tableColCount; col++) {
                TextView textView = new TextView(this);
                textView.setText("" + row + "." + col);
                textView.setTextSize(20.0f);
                tr.addView(textView, textViewSize, textViewSize);
            } // for
            table.addView(tr);
        } // for
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        LinearLayout table = (LinearLayout) findViewById(R.id.table);

        switch (item.getItemId()) {

            case R.id.action_zoom_in:
                table.setScaleX(1.0f);
                table.setScaleY(1.0f);
                break;
            case R.id.action_zoom_out:
                table.setScaleX(0.25f);
                table.setScaleY(0.25f);
                break;
        } // switch
        return true;
    }
}

スクリーン ショット:ズームイン| ズームアウト

この質問は私の質問とほとんど同じであることに気付きましたが、コードも回答もありませんでした。

4

1 に答える 1

1

view手動で(を使用する代わりに)のサイズを設定すると、wrap_contentうまくいきました。実際にかかったのはこれだけです:

FrameLayout.LayoutParams tableLP = new FrameLayout.LayoutParams(
    textViewSize * tableColCount, textViewSize * tableRowCount);
table.setLayoutParams(tableLP);

また、ピボット ポイントを 0 に設定して、ビューを左上隅に保ちます。

table.setPivotX(0);
table.setPivotY(0);

pskink (私の元の質問にコメントしてくれた人)に関しては、アニメーションを調べたところ、 a を使用してViewPropertyAnimatorもかなりうまく機能することがわかりました。このクラスを使用するには、 を呼び出すだけView.animate()です。

スケーリングされるのサイズviewとピボット ポイントを設定した後view、アニメーションを使用しない基本的なスケーリング方法を使用するか、

// zoom in by 50%
float scale = 0.5f;
view.setScaleX(table.getScaleX() + scale);
view.setScaleY(table.getScaleY() + scale);

またはアニメーションによるスケーリング方法。

// zoom in by 50%
float scale = 0.5f;
table.animate().scaleXBy(scale).scaleYBy(scale).setDuration(0).start();

元の質問のプログラムの完全な例を次に示します。

package com.example.zoom;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.FrameLayout;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TableLayout table = (TableLayout) findViewById(R.id.table);

        int textViewSize = 100;
        int tableColCount = 15;
        int tableRowCount = 15;

        for (int row = 0; row < tableRowCount; row++) {
            TableRow tr = new TableRow(this);
            for (int col = 0; col < tableColCount; col++) {
                TextView textView = new TextView(this);
                textView.setText(row + "." + col);
                textView.setTextSize(20.0f);
                tr.addView(textView, textViewSize, textViewSize);
            } // for
            table.addView(tr);
        } // for

        // manually set the size to make sure the entire view is drawn and will be seen when scaled down
        FrameLayout.LayoutParams tableLP = new FrameLayout.LayoutParams(textViewSize * tableColCount, textViewSize * tableRowCount);
        table.setLayoutParams(tableLP);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        TableLayout table = (TableLayout) findViewById(R.id.table);
        // set default scale to 0 in case no scale occurs
        float scale = 0.0f;

        switch (item.getItemId()) {

            case R.id.action_zoom_in:
                scale = 0.5f;
                break;
            case R.id.action_zoom_out:
                // use negative to decrease the scale
                scale = -0.5f;
                break;
        } // switch

        // set pivot to 0 to keep view in the top left corner
        table.setPivotX(0);
        table.setPivotY(0);
        // add new scale with current scale to get View.scaleBy() equivalent
        table.setScaleX(table.getScaleX() + scale);
        table.setScaleY(table.getScaleY() + scale);
//      could use an animation instead
//      table.animate().scaleXBy(scale).scaleYBy(scale).setDuration(0).start();
        return true;
    }
}
于 2013-06-09T14:17:20.697 に答える