日历控件的绘制

来源:互联网 发布:视频双屏播放软件 编辑:程序博客网 时间:2024/06/06 09:41
/** *  * Copyright (c) 2012 All rights reserved * 描述:日历控件单元格绘制类 * @author LiuZiwei * @date:2014-4-28 */@SuppressLint("ViewConstructor")public class CalendarCell extends View {// 字体大小/** The text size. */private int textSize = 22;// 基本元素/** The m on item click listener. */private AbOnItemClickListener mOnItemClickListener;/** The pt. */private Paint pt = new Paint();/** The rect. */private RectF rect = new RectF();//显示的文字/** The text date value. */private String textDateValue = "";// 当前日期/** The i date year. */private int iDateYear = 0;/** The i date month. */private int iDateMonth = 0;/** The i date day. */private int iDateDay = 0;// 布尔变量/** The is selected. */private boolean isSelected = false;/** The is active month. */private boolean isActiveMonth = false;/** The is today. */private boolean isToday = false;/** The b touched down. */private boolean bTouchedDown = false;/** The has record. */private boolean hasRecord = false;//当前cell的序号/** The position. */private int position = 0;/** The anim alpha duration. */public static int ANIM_ALPHA_DURATION = 100;/*被选中的cell颜色*//** The select cell color. */private int selectCellColor = Color.rgb(150, 195, 70);/*最大背景颜色*//** The bg color. */private int bgColor =Color.rgb(255,255,255);/*本月可选的背景色*/private int iMonthColor=Color.rgb(228,228,228);/*数字颜色*//** The number color. */private int numberColor = Color.rgb(86, 86, 86);/*非本月的数字颜色,白色*//** The cell color. */private int notActiveMonthColor =  Color.rgb(255,255,255);//Color.rgb(228,228,228);/*不可选的表格的背景色*//** The not active month color. */private int cellColor = Color.rgb(248,248,248);/*今天的表格颜色,蓝色*//** The today color. */private int todayColor = Color.rgb(150, 200, 220);private int orager=Color.rgb(252, 124, 26);private boolean isLatDay=false;private boolean isOrange=false;// 构造函数/** * Instantiates a new calendar cell. * * @param context the context * @param position the position * @param iWidth the i width * @param iHeight the i height */public CalendarCell(Context context, int position,int iWidth, int iHeight) {super(context);setFocusable(true);setLayoutParams(new LayoutParams(iWidth, iHeight));this.position = position;if(MY.PHONEWIDTH>1000){textSize=30;}}/** * 描述:获取这个Cell的日期. * * @return the this cell date */public Calendar getThisCellDate() {Calendar calDate = Calendar.getInstance();calDate.clear();calDate.set(Calendar.YEAR, iDateYear);calDate.set(Calendar.MONTH, iDateMonth);calDate.set(Calendar.DAY_OF_MONTH, iDateDay);return calDate;}/** * 描述:设置这个Cell的日期. * * @param iYear the i year * @param iMonth the i month * @param iDay the i day * @param isToday the is today * @param isSelected the is selected * @param isHoliday the is holiday * @param isActiveMonth the is active month * @param hasRecord the has record */public void setThisCellDate(int iYear, int iMonth, int iDay, Boolean isToday,Boolean isSelected,Boolean isHoliday, int isActiveMonth, boolean isLatDay,boolean isOrange,boolean hasRecord) {iDateYear = iYear;iDateMonth = iMonth;iDateDay = iDay;this.isLatDay=isLatDay;this.isOrange=isOrange;this.textDateValue = Integer.toString(iDateDay);this.isActiveMonth = (iDateMonth == isActiveMonth);this.isToday = isToday;this.hasRecord = hasRecord;this.isSelected = isSelected;}public int getiDateDay() {return iDateDay;}public void setiDateDay(int iDateDay) {this.iDateDay = iDateDay;}public int getiDateMonth() {return iDateMonth;}public void setiDateMonth(int iDateMonth) {this.iDateMonth = iDateMonth;}/** * 描述:重载绘制方法. * * @param canvas the canvas * @see android.view.View#onDraw(android.graphics.Canvas) */@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);        Log.e("从新绘制", "重新绘制");canvas.drawColor(bgColor);rect.set(0, 0, this.getWidth(), this.getHeight());rect.inset(0.5f, 0.5f);final boolean bFocused = IsViewFocused();drawDayView(canvas, bFocused);drawDayNumber(canvas);}/** * Checks if is view focused. * * @return true, if successful */public boolean IsViewFocused() {return (this.isFocused() || bTouchedDown);}/** * 描述:绘制日历方格. * * @param canvas the canvas * @param bFocused the b focused */private void drawDayView(Canvas canvas, boolean bFocused) {        Log.e("绘制", "绘制");pt.setColor(getCellColor());canvas.drawRect(rect, pt);}/** * 描述:绘制日历中的数字. * * @param canvas the canvas */public void drawDayNumber(Canvas canvas) {// draw day numberpt.setTypeface(null);pt.setAntiAlias(true);pt.setShader(null);pt.setFakeBoldText(true);pt.setTextSize(textSize);pt.setColor(numberColor);pt.setUnderlineText(false);if (!isActiveMonth || isLatDay){pt.setColor(notActiveMonthColor);}if(isOrange){pt.setColor(orager);}final int iPosX = (int) rect.left + ((int) rect.width() >> 1) - ((int) pt.measureText(textDateValue) >> 1);final int iPosY = (int) (this.getHeight() - (this.getHeight() - getTextHeight()) / 2 - pt.getFontMetrics().bottom);canvas.drawText(textDateValue, iPosX, iPosY, pt);}/** * 描述:得到字体高度. * * @return the text height */private int getTextHeight() {return (int) (-pt.ascent() + pt.descent());}/** * 描述:根据条件返回不同颜色值. * * @return the cell color */public int getCellColor() {if (isToday){return todayColor;}if (isSelected){return selectCellColor;}if(!isActiveMonth || isLatDay){return iMonthColor;}//如需周末有特殊背景色/*if (isHoliday){   return cellColor;}*///默认是白色的单元格return cellColor;}/** * 描述:设置是否被选中. * * @param selected the new selected */@Overridepublic void setSelected(boolean selected) { if (this.isSelected != selected) {this.isSelected = selected;String date=CalendarView.getStrDateAtPosition(position);if(selected){if(!PublishWiFi.listPostion.contains(date)){PublishWiFi.listPostion.add(date);}else{for(int i=0;i<PublishWiFi.listPostion.size();i++){if(PublishWiFi.listPostion.get(i).equals(date)){PublishWiFi.listPostion.remove(i);setSelected(false);break;}}}}}}/** * 描述:设置是否有数据. * * @param hasRecord the new checks for record */public void setHasRecord(boolean hasRecord) {if (this.hasRecord != hasRecord) {this.hasRecord = hasRecord;this.invalidate();}}/** * 描述:设置点击事件. * * @param onItemClickListener the new on item click listener */public void setOnItemClickListener(AbOnItemClickListener onItemClickListener) {this.mOnItemClickListener = onItemClickListener;}/** * 描述:执行点击事件. */public void doItemClick() {if (mOnItemClickListener != null){mOnItemClickListener.onClick(position);    }}/** * 描述:TODO. * * @param event the event * @return true, if successful * @see android.view.View#onTouchEvent(android.view.MotionEvent) * @author: zhaoqp * @date:2013-7-19 下午4:31:18 * @version v1.0 */@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean bHandled = false;if (event.getAction() == MotionEvent.ACTION_DOWN) {bHandled = true;bTouchedDown = true;invalidate();startAlphaAnimIn(CalendarCell.this);}if (event.getAction() == MotionEvent.ACTION_CANCEL) {bHandled = true;bTouchedDown = false;invalidate();}if (event.getAction() == MotionEvent.ACTION_UP) {bHandled = true;bTouchedDown = false;invalidate();doItemClick();}return bHandled;}/** * 描述:TODO. * * @param keyCode the key code * @param event the event * @return true, if successful * @see android.view.View#onKeyDown(int, android.view.KeyEvent) * @author: zhaoqp * @date:2013-7-19 下午4:31:18 * @version v1.0 */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {boolean bResult = super.onKeyDown(keyCode, event);if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER)|| (keyCode == KeyEvent.KEYCODE_ENTER)) {doItemClick();}return bResult;}/** * 描述:动画不透明度渐变. * * @param view the view */public static void startAlphaAnimIn(View view) {AlphaAnimation anim = new AlphaAnimation(0.5F, 1);anim.setDuration(ANIM_ALPHA_DURATION);anim.startNow();view.startAnimation(anim);}/** * 描述:有记录时的样子. * * @param canvas the canvas * @param Color the color */public void createReminder(Canvas canvas, int Color) {pt.setUnderlineText(true);pt.setStyle(Paint.Style.FILL_AND_STROKE);pt.setColor(Color);Path path = new Path();path.moveTo(rect.right - rect.width() / 4, rect.top);path.lineTo(rect.right, rect.top);path.lineTo(rect.right, rect.top + rect.width() / 4);path.lineTo(rect.right - rect.width() / 4, rect.top);path.close();canvas.drawPath(path, pt);pt.setUnderlineText(true);}/** * 描述:是否为活动的月. * * @return true, if is active month */public boolean isActiveMonth() {return isActiveMonth;}}

0 0
原创粉丝点击