/*
* 系统名称:
* 模块名称:
* 描述:
* 作者:徐骏
* version 1.0
* time 2010-11-5 下午01:07:14
* copyright Anymusic Ltd.
*/
package xujun.keepaccount.calendar;
import java.util.Calendar;
import xujun.keepaccount.R;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Paint.Align;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnTouchListener;
import android.widget.Toast;
/**
* @author 徐骏
* @data 2010-11-5
*/
public class CalendarWidget extends View implements OnTouchListener
{
private Context context;
private Paint paint = new Paint();
private RectF borderRect;
private Rect canlendarRect;
private Rect dayCellContextRect;
private CalendarHeader header;
private DayCell[] dayCells = new DayCell[42];
private Calendar calendar = Calendar.getInstance();
private Calendar todayCalendar = Calendar.getInstance();
private DayCell curDayCell;
private int moveX =0;//X方向上在onScroll中的移动像素
private GestureDetector detector;//手势运动委托器
private CalendarAction gestureAction ;
private OnCalendarSelectedListenter calendarSelectedListenter;
public CalendarWidget(Context context)
{
super(context,null);
}
public CalendarWidget(Context context, AttributeSet attrs)
{
super(context, attrs);
init(context);
}
private void init(Context context)
{
this.context = context;
gestureAction = CalendarAction.CALENDAR_DEFAULT;
setOnTouchListener(this);
detector = new GestureDetector(context,new MyGestureListener());
setLongClickable(true);//这样才能启动Gesture [dʒestʃə]
header = new CalendarHeader(this.context);
for(int i=0;i<42;i++)
{
dayCells[i] = new DayCell();
}
setCalendar();
}
private void setCalendar()
{
//先清除状态
for(int i=0;i<42;i++)
{
dayCells[i].clearState();
}
//根据日期设置DayCell
//设置日历是本月1号
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), 1);
//获得本月有多少天
int maxday = calendar.getActualMaximum(Calendar.DATE);
//第一天是星期几
int dayofweek = calendar.get(Calendar.DAY_OF_WEEK)-1;
for(int i=dayofweek;i<maxday+dayofweek;i++)
{
int day = calendar.get(Calendar.DATE);
dayCells[i].setText(""+day);
//今天 (年月日三者相等 小时毫秒这些不比较)
if(todayCalendar.get(Calendar.YEAR) == calendar.get(Calendar.YEAR)
&&todayCalendar.get(Calendar.MONTH) == calendar.get(Calendar.MONTH)
&&todayCalendar.get(Calendar.DATE) == calendar.get(Calendar.DATE))
{
dayCells[i].setToday(true);
}
//周六
if(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY)
{
dayCells[i].setFontColor(context.getResources().getColor(R.color.canlendar_week_6));
}
//周日
if(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
{
dayCells[i].setFontColor(context.getResources().getColor(R.color.canlendar_week_7));
}
//设置值
dayCells[i].setYear(calendar.get(Calendar.YEAR));
dayCells[i].setMonth(calendar.get(Calendar.MONTH));
dayCells[i].setDay(calendar.get(Calendar.DATE));
//+1天,注意运行到最后,就是第二个月的第一天了。
calendar.add(Calendar.DATE, 1);
}
//最后要重新设置为本月的第一天,这样为了滑动作准备
calendar.add(Calendar.MONTH, -1);
}
@Override
public boolean onTouch(View arg0, MotionEvent e)
{
detector.onTouchEvent(e);
if(e.getAction() == MotionEvent.ACTION_UP)
{
if(gestureAction == CalendarAction.CALENDAR_RIGHT)
{
moveX = 0;
calendar.add(Calendar.MONTH, -1);
setCalendar();
anycInvalidate();
}
if(gestureAction == CalendarAction.CALENDAR_LEFT)
{
moveX = 0;
calendar.add(Calendar.MONTH, 1);
setCalendar();
anycInvalidate();
}
if(gestureAction == CalendarAction.CALENDAR_NONE)
{
moveX = 0;
setCalendar();
anycInvalidate();
}
//转发事件
if(gestureAction == CalendarAction.CALENDAR_TOUCH)
{
if(calendarSelectedListenter != null)
{
calendarSelectedListenter.onSelected(curDayCell.getYear(), curDayCell.getMonth(), curDayCell.getDay());
}
}
gestureAction = CalendarAction.CALENDAR_DEFAULT;// 清除状态
}
return false;
}
private void anycInvalidate()
{
new Thread(new Runnable(){
@Override
public void run()
{
postInvalidate();
}
}).start();
}
@Override
public void onDraw(Canvas canvas)
{
compute();
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
// drawBorder(canvas);
drawTitle(canvas);
header.drawWeekHeader(canvas,canlendarRect);
drawDayCells(canvas);
}
private void drawDayCells(Canvas canvas)
{
for (DayCell cell:dayCells)
{
cell.drawDay(canvas);
}
}
private void drawBorder(Canvas canvas)
{
paint.setColor(context.getResources().getColor(R.color.canlendar_border));
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(3);
canvas.drawRoundRect(borderRect, 10, 10, paint);
}
private void compute()
{
//Stroke宽度为3,留白1,这样就空4出来
borderRect = new RectF(4,4,getWidth()-4,getHeight()-4);
canlendarRect = new Rect(moveX+14,24,getWidth()+moveX-14,getHeight()-14);
header.setHeaderRect(canlendarRect);
dayCellContextRect = header.computeDayCellRect();
//计算每个Cell的高和宽
int cellWidth = dayCellContextRect.width() / 7;
int cellHeight = dayCellContextRect.height()/6;//最多6行
int startX = dayCellContextRect.left;
int startY = dayCellContextRect.top;
int colIndex = 1;
for(int i=0;i<42;i++)
{
Rect rect = new Rect(startX,startY,startX+cellWidth,startY+cellHeight);
//7个一行
if(colIndex % 7 != 0)
{
startX = startX+cellWidth;
}
//换行,Y下移一个cell的高度,X回到起点
else
{
startX = dayCellContextRect.left;
startY = startY+cellHeight;
}
colIndex++;
DayCell dayCell = dayCells[i];
dayCell.setRect(rect);
}
}
private void drawTitle(Canvas canvas)
{
paint.setStyle(Paint.Style.FILL);
paint.setTextSize(15);
paint.setFakeBoldText(true);//伪粗体,中文使用
paint.setTextAlign(Align.CENTER);
paint.setColor(context.getResources().getColor(R.color.canlendar_header));
int month = calendar.get(Calendar.MONTH)+1;
canvas.drawText(calendar.get(Calendar.YEAR)+"年"+month+"月", canlendarRect.left+canlendarRect.width() / 2, canlendarRect.top-4 , paint);
}
class MyGestureListener extends SimpleOnGestureListener
{
//用户按下触摸屏,尚未松开或拖动,由一个MotionEvent.ACTION_DOWN触发.
//注意和onDown的区别,强调的是没有松开或者拖动的状态
@Override
public void onShowPress(MotionEvent arg0)
{
super.onShowPress(arg0);
}
//用户按下触摸屏,由一个MotionEvent.ACTION_DOWN触发
@Override
public boolean onDown(MotionEvent e)
{
//只增加背景,不触发处理
for(final DayCell cell : dayCells)
{
if(cell.isClicked((int)e.getX(), (int)e.getY()) && cell.getText() != null)
{
if(curDayCell != null)
{
curDayCell.setSelected(false);
//更新局部,提高性能
CalendarWidget.this.invalidate(curDayCell.getRect().left, curDayCell.getRect().top,
curDayCell.getRect().right, curDayCell.getRect().bottom);
}
cell.setSelected(true);
没有合适的资源?快使用搜索试试~ 我知道了~
安卓记账源码
共169个文件
class:61个
png:51个
java:26个
1星 需积分: 16 23 下载量 189 浏览量
2017-12-10
11:06:00
上传
评论 1
收藏 557KB RAR 举报
温馨提示
基于安卓平台的记账软件源码,已经包含了基本的记账功能,可以参考和修改做毕业设计
资源推荐
资源详情
资源评论
收起资源包目录
安卓记账源码 (169个子文件)
resources.ap_ 124KB
YunAccount.apk 176KB
CalendarWidget.class 8KB
TodayAccount.class 5KB
HistoryAccount.class 5KB
TabBarActivity.class 5KB
TypeAccountList.class 5KB
QueryAccount.class 5KB
DBHelper.class 4KB
ImageUtil.class 4KB
DayCell.class 4KB
CalendarView.class 4KB
CalendarWidget$MyGestureListener.class 4KB
HistoryAccount$ListItemAdapter.class 4KB
TodayAccount$ListItemAdapter.class 3KB
TypeAccount.class 3KB
ButtonStateDrawable.class 3KB
WriteAccount.class 3KB
WriteAccount$2.class 3KB
AccountEnum.class 3KB
WriteAccount$2$1.class 3KB
TabBarButton.class 2KB
HistoryAccount$DeleteHisAccountBroadcastReceiver.class 2KB
CalendarHeader.class 2KB
TodayAccount$DeleteAaccountBroadcastReceiver.class 2KB
DateSelectorDialog.class 2KB
TypeAccount$GridItemAdapter.class 2KB
ButtonDemo$1.class 2KB
R$id.class 2KB
DBHelper$DBCreator.class 2KB
DateSelectorDialog$2.class 2KB
HistoryAccount$ListItemAdapter$1.class 2KB
CanlendarDialog.class 2KB
QueryAccount$1.class 1KB
TodayAccount$ListItemAdapter$1.class 1KB
Account.class 1KB
HistoryAccount$QueryAccountBroadcastReceiver.class 1KB
ButtonDemo.class 1KB
R$drawable.class 1KB
CalendarAction.class 1KB
Main.class 1KB
CalendarUtil.class 1KB
WriteAccount$2$2.class 1KB
ButtonDemo$1$3.class 1KB
ButtonDemo$1$1.class 1KB
ButtonDemo$1$2.class 1KB
WriteAccount$1.class 1KB
TabBarActivity$ChangeTabBroadcastReceiver.class 1KB
CalendarWidget$MyGestureListener$1.class 1KB
R$layout.class 936B
DateSelectorDialog$1.class 906B
ChartActivity.class 903B
HistoryAccount$ListItemAdapter$ListItemView.class 902B
TodayAccount$ListItemAdapter$ListItemView.class 864B
MessageUtil.class 855B
CalendarWidget$1.class 711B
R.class 663B
R$color.class 584B
R$string.class 435B
R$anim.class 418B
R$style.class 403B
R$attr.class 337B
OnCalendarSelectedListenter.class 192B
.classpath 345B
classes.dex 102KB
achartengine-0.5.0.jar 42KB
CalendarWidget.java 10KB
TodayAccount.java 7KB
HistoryAccount.java 6KB
R.java 6KB
TabBarActivity.java 4KB
DBHelper.java 4KB
ImageUtil.java 4KB
WriteAccount.java 4KB
QueryAccount.java 3KB
TypeAccountList.java 3KB
TypeAccount.java 3KB
ButtonStateDrawable.java 3KB
DayCell.java 3KB
CalendarView.java 3KB
TabBarButton.java 2KB
ButtonDemo.java 2KB
DateSelectorDialog.java 2KB
AccountEnum.java 2KB
CalendarHeader.java 1KB
Main.java 1KB
CanlendarDialog.java 1KB
Account.java 1KB
CalendarUtil.java 814B
ChartActivity.java 502B
OnCalendarSelectedListenter.java 360B
MessageUtil.java 291B
big_write.png 6KB
big_write.png 6KB
tabbar_food.png 5KB
tabbar_food.png 5KB
tabbar_toy.png 5KB
tabbar_toy.png 5KB
tabbar_flower.png 5KB
tabbar_flower.png 5KB
共 169 条
- 1
- 2
资源评论
- 大数据机器学习实验室2018-09-25都是好多年前的啦
Micr067
- 粉丝: 74
- 资源: 38
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 天气预报爬虫 (WeatherCrawler) 介绍:这个脚本可以爬取天气预报网站上的天气信息,如温度、湿度、风速等,并打印出来
- ticket.jpeg
- 邮件爬虫 (EmailCrawler) 介绍:这个脚本可以爬取特定网页上的电子邮件地址,并打印出来
- 电商爬虫 (EcommerceCrawler) 介绍:这个脚本可以爬取电商网站上的商品信息,如商品名称、价格等,并打印出来
- 论坛爬虫 (ForumCrawler) 这个脚本可以爬取论坛上的帖子标题和链接,并打印出来
- 第十五届蓝桥杯单片机第一场代码
- Python 正则表达式.docx
- 微博爬虫 (WeiboCrawler) 介绍:这个脚本可以爬取微博用户的最新微博内容,并打印出来
- 介绍:这个脚本可以爬取新闻网站上的新闻标题和链接,并打印出来
- 1_OAM基础知识.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功