1

ピンチズームジェスチャーで TextView をスケーリングしようとしています。ピンチズームが機能していますが、テキストが拡大縮小されると、多少ピクセル化されます。これは、実際のフォントサイズがスケーリングされていないためだと思います。ただし、onTouch() メソッド内の任意の場所に setTextSize() を配置しようとすると、TextView の端に小さな線が表示されたり消えたりして、スケーリングが十分に大きくなるとテキストが消えて、非常に途切れ途切れになります。LinearLayout 内に TextView があり、ピンチ ズームは LinearLayout をスケーリングします。

レイアウトxmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FF000000" >

<LinearLayout
    android:id="@+id/textLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:text="texthere" />

</LinearLayout>

<View
    android:id="@+id/touchView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

</FrameLayout>

タッチ リスナー Java は次のとおりです。

scaleView.setOnTouchListener(new View.OnTouchListener(){
        public boolean onTouch(View v, MotionEvent event){
            float viewWidth = mTextView.getWidth();
            float viewHeight = mTextView.getHeight();
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                mode = DRAG;
                x_0 = mTextView.getX();//+50;
                y_0 = mTextiew.getY();//+50;
                initialTouchRawX = event.getRawX();
                initialTouchRawY = event.getRawY();
                currentScale = mTextView.getScaleX();
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist2 = spacing(event);
                if (oldDist2 > 10f) {
                    mode = ZOOM;
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                break;
            case MotionEvent.ACTION_MOVE:
                float xmin = x_0 - viewWidth/2*(currentScale-1);
                float xmax = x_0 + viewWidth + viewWidth/2*(currentScale-1);
                float ymin = y_0 - viewHeight/2*(currentScale-1) + viewShift;
                float ymax = y_0 + viewHeight + viewHeight/2*(currentScale-1) + viewShift;
                if (mode == DRAG && initialTouchRawX >= xmin && initialTouchRawX <= xmax && initialTouchRawY >= ymin && initialTouchRawY <= ymax ) { 
                    float mShiftX = -(initialTouchRawX - x_0);
                    float mShiftY = -(initialTouchRawY - y_0);
                    mTextView.setX((float) event.getRawX()+mShiftX);
                    mTextView.setY((float) event.getRawY()+mShiftY);
                } else if (mode == ZOOM) {
                    float newDist2 = spacing(event);
                    if (newDist2 > 10f) {
                        newScale = newDist2 / oldDist2 * currentScale;
                        mTextView.setScaleX(newScale);
                        mTextView.setScaleY(newScale);
                        //***I've tried setting the font size here***
                    }
                }
                break;
            }
            //***I've tried setting the font size here***
            //*** Now I write the scaling float to shared preferences here
            return true; 
        }
    });

フォントサイズを実際にどこでどのようにスケーリングするかについて混乱しています。setFontSize() を実装しようとしたコードで示しました。つまり、ほとんどの場合は機能しましたが、上で述べたように、テキストが消えたり、TextView の端に線が表示されたりするなど、品質が非常に悪かったのです。どんなヒントでも大歓迎です。

=== 編集: ===

以下のカスタム TextView を実装しました。

public class ScaleTextView extends TextView {

public ScaleTextView(Context context) {
    this(context, null);
}

public ScaleTextView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public ScaleTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    updateTextSize(context);
}

public void updateTextSize(Context context) {
    getTypeface();
    float currentTextSize = getTextSize();
    SharedPreferences otherSettings = context.getSharedPreferences("settings", 0);
    float newScale = otherSettings.getFloat("key_scaling", 1f);
    setTextSize(newScale * currentTextSize); 
}

}

そのため、縦向きと横向きでフォント サイズが異なることを除いて、これはいくらか役立ちます。これにより、向きが変更されるたびにスケーリングが変更されます。スケールが十分に大きくなると、テキストは依然として消え、テキストビューの端に線が表示されることがあります。スケーリング変数をカスタム ScaleTextView クラスに渡すためのより良い方法があるでしょうか?

4

0 に答える 0