好歹是第一个嘛。
缩放字体花了点时间,连续运行的逻辑折腾了半天,其他也没什么了,留下一些坑:double类型二进制转十进制的诡异问题,连续按等号,预留按键,退格键,以后再说吧。(估计是不会有以后了。。)
package cn.michael.calculator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextPaint;
import android.util.TypedValue;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
/**
* Created by Michael on 2016/1/12.
* Finish by Michael on 2016/1/13.
* 实现加减乘除,屏幕缩放,连续运算等功能。
*/
public class MainActivity extends AppCompatActivity {
double ansNum=0;
double showNum=0;
double aNum=0;
double bNum=0;
int dotCount=0;
int operator=0;
boolean hasANum = false;
//统一屏显输出函数
public void showText(double showNum)
{
TextView text=(TextView)findViewById(R.id.textView);
String str=Double.toString(showNum);
int len=str.length();
text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 100);
//判断计数法,去尾零
if (!str.contains("E"))
str=str.substring(len-1,len).equals("0") ? str.substring(0,len-1) : str;
//缩放字体
TextPaint FontPaint = new TextPaint();
FontPaint.setTextSize(text.getTextSize());
if (FontPaint.measureText(str)>text.getWidth())
text.setTextSize(TypedValue.COMPLEX_UNIT_PX,text.getTextSize()*text.getWidth() / FontPaint.measureText(str)-10);
text.setText(str);
}
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.main_layout);
//数字键监视实现
View.OnClickListener numListener= new View.OnClickListener() {
@Override
public void onClick(View v) {
if (MainActivity.this.operator==0)
MainActivity.this.hasANum=false;
//将按键名转换为数字
int b=Integer.parseInt(((Button)v).getText().toString());
//小数点
if (MainActivity.this.dotCount==0)
MainActivity.this.showNum=MainActivity.this.showNum*10+b;
else {
MainActivity.this.showNum+=b/Math.pow(10,dotCount);
dotCount++;
}
MainActivity.this.showText(MainActivity.this.showNum);
}
};
//数字键监视定义
findViewById(R.id.num1).setOnClickListener(numListener);
findViewById(R.id.num2).setOnClickListener(numListener);
findViewById(R.id.num3).setOnClickListener(numListener);
findViewById(R.id.num4).setOnClickListener(numListener);
findViewById(R.id.num5).setOnClickListener(numListener);
findViewById(R.id.num6).setOnClickListener(numListener);
findViewById(R.id.num7).setOnClickListener(numListener);
findViewById(R.id.num8).setOnClickListener(numListener);
findViewById(R.id.num9).setOnClickListener(numListener);
findViewById(R.id.num0).setOnClickListener(numListener);
//点键监听实现,定义
findViewById(R.id.dot).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.this.dotCount = 1;
}
});
//等于键监听实现
final View.OnClickListener equalListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.this.bNum=MainActivity.this.showNum;
switch (MainActivity.this.operator)
{
case 1:
MainActivity.this.ansNum=MainActivity.this.aNum+MainActivity.this.bNum;
break;
case 2:
MainActivity.this.ansNum=MainActivity.this.aNum-MainActivity.this.bNum;
break;
case 3:
MainActivity.this.ansNum=MainActivity.this.aNum*MainActivity.this.bNum;
break;
case 4:
MainActivity.this.ansNum=MainActivity.this.aNum/MainActivity.this.bNum;
break;
case 0:
}
MainActivity.this.showText(MainActivity.this.ansNum);
MainActivity.this.showNum=0;
MainActivity.this.operator=0;
MainActivity.this.aNum=MainActivity.this.ansNum;
MainActivity.this.dotCount=0;
}
};
//等于键监听定义
findViewById(R.id.equal).setOnClickListener(equalListener);
//运算符键监听实现
View.OnClickListener operatorListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!MainActivity.this.hasANum) {
MainActivity.this.aNum = MainActivity.this.showNum;
MainActivity.this.hasANum=true;
}
else
equalListener.onClick(null);
MainActivity.this.showNum = 0;
MainActivity.this.dotCount=0;
switch (v.getId()) {
case R.id.plus:
MainActivity.this.operator=1;
break;
case R.id.minus:
MainActivity.this.operator=2;
break;
case R.id.multiply:
MainActivity.this.operator=3;
break;
case R.id.divide:
MainActivity.this.operator=4;
break;
}
}
};
//运算符键监听定义
findViewById(R.id.plus).setOnClickListener(operatorListener);
findViewById(R.id.minus).setOnClickListener(operatorListener);
findViewById(R.id.multiply).setOnClickListener(operatorListener);
findViewById(R.id.divide).setOnClickListener(operatorListener);
//清空键监听实现,定义
findViewById(R.id.clearevery).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TextView text = (TextView) findViewById(R.id.textView);
text.setText("0.");
text.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 100);
MainActivity.this.showNum = 0;
MainActivity.this.ansNum = 0;
MainActivity.this.operator = 0;
MainActivity.this.hasANum = false;
MainActivity.this.dotCount = 0;
}
});
//清除键监听实现,定义。清除键只清除屏幕显示。
findViewById(R.id.clear).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.this.showText(MainActivity.this.showNum = 0);
MainActivity.this.dotCount = 0;
}
});
}
}
main_layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="0."
android:id="@+id/textView"
android:layout_gravity="center_horizontal"
android:textSize="100dp"
android:gravity="center_vertical|right"
android:padding="5dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:padding="10dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text=""
android:textSize="50sp"
android:id="@+id/button1" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text=""
android:textSize="50sp"
android:id="@+id/button2" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="CE"
android:textSize="50sp"
android:id="@+id/clearevery" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="C"
android:textSize="50sp"
android:id="@+id/clear" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="7"
android:textSize="50sp"
android:id="@+id/num7" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="8"
android:textSize="50sp"
android:id="@+id/num8" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="9"
android:textSize="50sp"
android:id="@+id/num9" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="/"
android:textSize="50sp"
android:id="@+id/divide" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="4"
android:textSize="50sp"
android:id="@+id/num4" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="5"
android:textSize="50sp"
android:id="@+id/num5" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="6"
android:textSize="50sp"
android:id="@+id/num6" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="×"
android:textSize="50sp"
android:id="@+id/multiply" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="1"
android:textSize="50sp"
android:id="@+id/num1" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="2"
android:textSize="50sp"
android:id="@+id/num2" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="3"
android:textSize="50sp"
android:id="@+id/num3" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="-"
android:textSize="50sp"
android:id="@+id/minus" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="0"
android:textSize="50sp"
android:id="@+id/num0" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="."
android:textSize="50sp"
android:id="@+id/dot" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="="
android:textSize="50sp"
android:id="@+id/equal" />
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="+"
android:textSize="50sp"
android:id="@+id/plus" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
附源码http://download.csdn.net/download/a254244460/9402429
更新:
1.删去所有MainActivity.this.,多余。
2.统一double转String使用String.format()