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