在Android中使用静态按钮时无法缩小

在Android中使用静态按钮时无法缩小,android,textview,Android,Textview,我正在尝试为文本视图创建缩放(通过增加文本大小,而不是缩放视图)按钮。这是我的代码片段。 (这里我首先得到mytext_视图的文本大小,单击按钮时增加一个) 用于缩放 mzoomIn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { float x = mytext_view.getTextS

我正在尝试为文本视图创建缩放(通过增加文本大小,而不是缩放视图)按钮。这是我的代码片段。 (这里我首先得到mytext_视图的文本大小,单击按钮时增加一个)

用于缩放

mzoomIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                float x = mytext_view.getTextSize();
                mytext_view.setTextSize((float) (x + 1));
            }
        });
用于zoomOut

mzooomOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                float x = mytext_view.getTextSize();
                mytext_view.setTextSize((float) (x - 1));
            }
        });
我按预期获得zoomIn,但当我单击zoomOut按钮时,它也会再次zoomIn

main活动

public class MainActivity extends AppCompatActivity {

    private Button mzoomIn;
    private Button mzooomOut;
    private TextView mytext_view;

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

        mzoomIn = (Button) findViewById(R.id.btm_zoomIn);
        mzooomOut = (Button) findViewById(R.id.btm_zoomOut);
        mytext_view = (TextView) findViewById(R.id.mytext_view);
        mzoomIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                float x = mytext_view.getTextSize();
                mytext_view.setTextSize((float) (x + 1));
            }
        });

        mzooomOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                float x = mytext_view.getTextSize();
                mytext_view.setTextSize((float) (x - 1));
            }
        });
    }

}
活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.kathi.stackoverflow.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/mytext_view"
        android:text="Test! " />


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btm_zoomIn"
        android:text="Zoom in"
        android:layout_alignTop="@+id/btm_zoomOut"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btm_zoomOut"
        android:text="Zoom out"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />


</RelativeLayout>

这里是我单击第一个按钮时的调试点

第一次缩放:

第一次动物迁徙:


这背后的任何未知事实,救命

我怀疑+1-1不足以达到这个目的。实际增加或减少最小sp值的正确方法,即:

float onepx2sp = 1 * getResources().getDisplayMetrics().scaledDensity;
mytext_view.setTextSize(x + onepx2sp);


乌格尔B的回答是正确的。如果在调用
mtext\u view.setTextSize(x+1)
后调试
mtext\u view.getTextSize()
值。您会注意到,实际值远大于您设置的值。我记录了如下值:

            float x = mytext_view.getTextSize();
            Log.e("TEXT_OUT_OLD", String.valueOf(x));
            float new_val = x + 1;
            Log.e("TEXT_OUT_NEW", String.valueOf(new_val));
            mytext_view.setTextSize(new_val);
            Log.e("TEXT_OUT_AFTER", String.valueOf(mytext_view.getTextSize()));
mytext_view.setTextSize(TypedValue.COMPLEX_UNIT_PX, x + 1f);
 mytext_view.setTextSize(TypedValue.COMPLEX_UNIT_PX, x - 1f);
第一次按下放大按钮时。我把这些日志记录下来:

04-17 09:45:47.063 22297-22297/com.test.myapplication E/TEXT_OUT_OLD: 21.0
04-17 09:45:47.063 22297-22297/com.test.myapplication E/TEXT_OUT_NEW: 22.0
04-17 09:45:47.063 22297-22297/com.test.myapplication E/TEXT_OUT_AFTER: 33.0
每次后的
TEXT\u OUT\u值的增加远远超过预期。因此,当您按下“缩小”按钮时,实际上只是将值减小了1,但新的实际值要大得多。因此,解决方案是使用Uger B的答案并放大如下:

            float x = mytext_view.getTextSize();
            Log.e("TEXT_OUT_OLD", String.valueOf(x));
            float new_val = x + 1;
            Log.e("TEXT_OUT_NEW", String.valueOf(new_val));
            mytext_view.setTextSize(new_val);
            Log.e("TEXT_OUT_AFTER", String.valueOf(mytext_view.getTextSize()));
mytext_view.setTextSize(TypedValue.COMPLEX_UNIT_PX, x + 1f);
 mytext_view.setTextSize(TypedValue.COMPLEX_UNIT_PX, x - 1f);
像这样缩小:

            float x = mytext_view.getTextSize();
            Log.e("TEXT_OUT_OLD", String.valueOf(x));
            float new_val = x + 1;
            Log.e("TEXT_OUT_NEW", String.valueOf(new_val));
            mytext_view.setTextSize(new_val);
            Log.e("TEXT_OUT_AFTER", String.valueOf(mytext_view.getTextSize()));
mytext_view.setTextSize(TypedValue.COMPLEX_UNIT_PX, x + 1f);
 mytext_view.setTextSize(TypedValue.COMPLEX_UNIT_PX, x - 1f);
编辑:

您得到的值是不同的,因为它是底层实现。如果您看到setTextSize的源代码。是这样的:

public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

因为,新值是基于
TypedValue.COMPLEX\u UNIT\u SP
设置的。它不直接设置传递给方法的值,而是首先根据屏幕密度计算实际的
SP
值,然后分配值。

显示按钮定义,如..findViewById()。。。对于两个按钮和xml部分pls@UğurB我用完整的codeCan编辑了我的问题,你可以进入调试模式并看到
x-1
?@JoelMin在中添加了调试值Question@JoelMin当我从相同的
mytext\u视图
view对象
textView.setTextSize]中获取“getTextSize()”时,可以看到不可预测的值(TypedValue.COMPLEX_UNIT_PX,x+1f);
工作正常,但为什么+1-1不足以达到此目的?这背后有任何未知的事实,?getTextSize()返回缩放像素,最小sp值基于您的屏幕分辨率,大于1px。当您不告诉setTextSize将该值设置为px时,它将其接受为sp值,且1px小于您的最小sp值。如果我设置
mytext\u视图。setTextSize(10);
并获取
mytext\u视图。getTextSize()
值不同为什么?有什么具体原因吗?
如果您看到setTextSize的源代码,那就说得很好。现在我很清楚了。:)