安卓记账本app
功能实现
支出与收入的增删改查,饼状图实现占比动画展示、增加拍照功能
模块介绍
系统开发技术介绍
主要思想:通过sumValue求出数据库中所有数据的总和,将每一项除以sumValue可得占比,通过
DecimalFormat decimalFormat = new DecimalFormat("0.0");
decimalFormat.format(Percentage*100) + "%";
可以将其转换成具有一位小数格式的百分比。
随后通过百分比来计算对应的角度float angle = percentage * 360;
通过Paint类可实现绘画功能,重现onDraw
绘制饼图
canvas.drawArc(rectF, currentStartAngle, data.getAngle(), true, mPaint);
因为paint需要获取x,y值,所以需要通过三角函数计算下一块扇形对应的x与y
stopX = (float) ((r + 30) * Math.cos((2 * currentStartAngle + data.getAngle()) / 2 * Math.PI / 180));
stopY = (float) ((r + 30) * Math.sin((2 * currentStartAngle + data.getAngle()) / 2 * Math.PI / 180));
改进:添加自定义动画显示饼状图,使界面更加具有可视化效果,交互性更好
创建PieChartAnimation类继承Animation
重写void applyTransformation(float interpolatedTime, Transformation t)函数
使用setDuration(ANIMATION_DURATION)方法设置动画时间为1000
在6.0以上需要调用权限校验,之后在 Activity 中添加权限校验
public static void verifyStoragePermissions(Activity activity) {
int permission = ActivityCompat.checkSelfPermission(activity,
Manifest.permission.ACCESS_FINE_LOCATION);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE);
}
}
同时需要在AndroidManifest.xml中添加读写权限、相机权限,还需要在application中添加android:requestLegacyExternalStorage=“true”,保证权限被允许,否则会因为版本不同造成权限无法被允许。
创建了三个表,为tb_outaccount、tb_inaccount、tb_pwd,分别用来储存支出记录信息、收入记录信息和密码信息。
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table tb_outaccount (_id integer primary key,money decimal,time varchar(10),type varchar(10),address varchar(100),mark varchar(200))");
db.execSQL("create table tb_inaccount (_id integer primary key,money decimal,time varchar(10),type varchar(10),handler varchar(100),mark varchar(200))");
db.execSQL("create table tb_pwd (password varchar(20))");
}
拍摄:先通过Environment类中的getExternalStoragePublicDirectory()方法确定文件位置,获取此次活动的ID以及收入或支出的类型作为文件的名字,使用Uri类的fromFile()方法将其转换为Uri,最后赋予Intent IMAGE_CAPTRUE的动作,
再使用putExtra(MediaStore.EXTRA_OUTPUT,Uri)将数据放入,最后以TAKE_PHOTO作为RequestCode 来StartActivitForResult启动Intent.拍摄即可.
裁剪:OnActivityResult 方式一:TAKE_PHOTO,以com.android.camera.action.CROP作为动作新建Intent,设置setDataAndType为image,以”aspectX”, ”aspectY”, ”outputX”,
”outputY”作为name加入intent,再次使用putExtra(MediaStore.EXTRA_OUTPUT,Uri)将数据放入,最后以CROP_PHOTO作为RequestCode 来StartActivitForResult启动Intent.
显示: OnActivityResult 方式二:CROP_PHOTO,使用BitmapFactory类的decodeStream()方法将刚拍摄好的imageUri解析成Bitmap对象,再将layout上的imageView设置为该Bitmap即可.
读取: 通过Environment类中的getExternalStoragePublicDirectory()方法确定之前存储的文件位置,用收入或支出的类型加数据库中存放的本次活动的ID作为文件名,用FileInputStream打开文件,使用BitmapFactory类的decodeStream()方法将流转化为Bitmap图片.
在AndroidManifest.xml中每个activity中添加
android:parentActivityName=".MainActivity"
指向返回的界面,增强界面的交互性。
下载
demo下载:https://download.csdn.net/download/weixin_45330449/13111263