最近提出的申请,主接口是一个历,网上有很多第三方的日历控件,有使用ImageView实现,有使用GridView实现,它的优点是控制的灵活性.

而我选择使用本机CalendarView,关于这个控件,详细能够參考:http://android.toolib.net/reference/android/widget/CalendarView.html

缺点是没有提供周分隔线的自己定义图片的方法,以下的代码是android画周分隔线的代码,最初我想要重写这种方法来自己定义图片.后来我发现这个

方法是定义在CalendarView的私有内部类WeekView中的...有兴趣的同学能够研究一下怎么实现,顺便请@我 ^ ^

        /**
* Draws a horizontal line for separating the weeks.
*
* @param canvas The canvas to draw on.
*/
private void drawWeekSeparators(Canvas canvas) {
// If it is the topmost fully visible child do not draw separator line
int firstFullyVisiblePosition = mListView.getFirstVisiblePosition();
if (mListView.getChildAt(0).getTop() < 0) {
firstFullyVisiblePosition++;
}
if (firstFullyVisiblePosition == mWeek) {
return;
}
mDrawPaint.setColor(mWeekSeparatorLineColor);
mDrawPaint.setStrokeWidth(mWeekSeperatorLineWidth);
float startX;
float stopX;
if (isLayoutRtl()) {
startX = 0;
stopX = mShowWeekNumber ? mWidth - mWidth / mNumCells : mWidth;
} else {
startX = mShowWeekNumber ? mWidth / mNumCells : 0;
stopX = mWidth;
}
canvas.drawLine(startX, 0, stopX, 0, mDrawPaint);
}

以下我来说怎么通过选择图片来替换CalendarView的背景:

<CalendarView
android:id="@+id/date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusedMonthDateColor="@android:color/holo_purple"
android:background="@android:color/background_light"
android:showWeekNumber="false"
android:selectedWeekBackgroundColor="@color/touming"
android:weekSeparatorLineColor="@color/touming"
android:dateTextAppearance="@android:style/TextAppearance.Large"
android:shownWeekCount="5"
android:unfocusedMonthDateColor="@color/pink"
android:selectedDateVerticalBar="@drawable/xxxx"
/>

首先定义一个CalendarView,然后在你的java代码中获取它-->

mCalendarView = (CalendarView) findViewById(R.id.date);

然后你能够弄一个button或者其他的什么,绑定上它的事件,来触发我们切换到pic选择-->

Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, 0);

这种方法选择完,会回调这种方法,所以你要重写这个-->

        @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==0&&resultCode==RESULT_OK&&null!=data){
Uri selectedBGPath = data.getData();
//store BGpath to BGSP
BGSP sp = new BGSP(MainActivity.this);
sp.writeOneString("bgPath", selectedBGPath.toString());
//-----------------------------------------------------
this.setCalendarBG(selectedBGPath);
}
}

当中data是你选择的图片的Uri,大概是(Content:\\... 好像是这种),为了又一次打开应用时能够保存设置,我们要用SharedPreferences来保存这个路径.

下来我们要设置CalendarView的背景-->

        //设置选择的URI到背景
@SuppressLint("NewApi")
private void setCalendarBG(Uri uri){
Drawable drw = ImageOperations(uri,"");
mCalendarView.setBackground(drw);
}

当中能够看到把uri转换成Drawable的方法,这种方法是我在网上copy的,可是在我这没有问题:

private Drawable ImageOperations(Uri url, String saveFilename) {
InputStream is = null;
try {
is = getContentResolver().openInputStream(url);
Drawable d = Drawable.createFromStream(is, saveFilename);
return d;
} catch (IOException e) {
return null;
}finally{
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

当然is是我关闭的...

最后在activity启动的时候,增加以下的代码,用来推断应用是否已经自己定义过背景:

        /**
* 初始化日历背景
*/
private void initCalendarBG(){
BGSP sp = new BGSP(MainActivity.this);
String bgpath = sp.getOneString("bgPath");
if(!bgpath.equals(BGSP.DEFAULT_VALUE)){
this.setCalendarBG(Uri.parse(bgpath));
}
}

至此,就基本成型了...

写的比較乱,假设有谁想详细了解,就在以下评论一下 ^ ^

给你们看看效果是这种:(另外我自己定义了日期选择两边的bar...)

版权声明:本文博主原创文章,博客,未经同意不得转载。

更改Calendar背景图(使用系统映像选择器)的更多相关文章

  1. Linux操作系统之更改启动菜单的背景图实战案例

    Linux操作系统之更改启动菜单的背景图实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.制作图像并上传到服务器 1>.使用window 10操作系统自带的画图工具 ...

  2. vue项目中,无需打包而动态更改背景图以及标题

    1.背景 今天,项目经理对已完成的项目提出了一个需求,即项目的基础功能目前针对于各个基层法院都适用,而对于不同的法院,我们每次都需要前端研发来更改所属法院的法院名称以及背景图,这样对于演示者来说是非常 ...

  3. 在Excel表里面插入背景图

    工作中我们会经常用到MS Excel,通常我们打开MS Excel,里面的工作表都是空白单调的背景.当然了,MS Excel可以在工作簿里面插入背景图片.那么问题来了,如果你没有安装Microsoft ...

  4. 为Visual Studio更换皮肤和背景图

    最近在博客上别人在老早之前就有加了背景图,想想怎么能这么out,于是乎,百度一下,能否知道? 咳咳,资源还是有滴!可惜都是比较旧的跟新版本的配置方法可能有点不一样, 可能会有很多人会觉得不适应,不过没 ...

  5. [Unity3D插件]2dtoolkit系列二 动画精灵的创建以及背景图的无限滚动

    经过昨天2dtoolkit系列教程一的推出,感觉对新手还有有一定的启发作用,引导学习使用unity 2dToolKit插件的使用过程,今天继续系列二——动画精灵的创建,以及背景图的无限循环滚动,在群里 ...

  6. 如何让窗口控件半透明(控件在Paint自己时,首先向主窗口询问,获取主窗口上控件所在区域的背景图)

    在网上关于窗口视觉效果,有2个问题被问得最多:第一个是如何让窗口边框有阴影效果?第二个是如何让窗口控件有半透明效果? 对于第一个问题,我们的答案是用双层窗口模拟或是用Layered Window.在X ...

  7. 给Visual Studio更替皮肤和背景图

    给Visual Studio更换皮肤和背景图 1.先安装更换皮肤的插件  VS菜单栏里面找到:工具>扩展和更新>联机>搜索: Theme Editor   下载并安装: 安装后先不着 ...

  8. QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

    QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg ...

  9. 清除css、javascript及背景图在浏览器中的缓存

    在实际项目开发过过程中,页面是上传到服务器上的.而为了减少服务器的压力,让用户少加载,浏览器会将图片.css.js缓存到本地中,以便下次访问网站时使用.这样做不仅减少了服务器的压力,并且也减少了用户的 ...

随机推荐

  1. SVN 的revert操作

  2. 在配置文件(.settings、.config)中存储自定义对象

    原文:在配置文件(.settings..config)中存储自定义对象 引言 我前面曾写过一篇<使用配置文件(.settings..config)存储应用程序配置>,我在其中指出“sett ...

  3. CSS3 3D旋转动画代码实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. windows phone (21) Grid元素的Background和Clip

    原文:windows phone (21) Grid元素的Background和Clip Grid是唯一可以在内部定制单元格的panel类,我们可以在grid中定制单元格,然后通过grid.row和g ...

  5. POJ 1276  Cash Machine(多重背包)

    Cash Machine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24132 Accepted: 8446 Descrip ...

  6. 每天一点儿JAVA-向量的操作

    package java_prac2; import java.util.*; /** * <p>Title: 矢量操作</p> * <p>Description: ...

  7. Gitblit配置

    Gitblit的安装配置及访问-windows (2013-09-11 11:52:31) 转载▼   分类: android基础 Git 是现在很流行的分布式版本控制工具,github更是人人皆知. ...

  8. MySQL 批量Dll操作(转)

    概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...

  9. SQLServer2014新功能

    随机存取存储器 OLTP:提供了内置在芯 SQL Server 数据库内存 OLTP 特征,为了显著提高事务数据库应用程序的速度和吞吐量.随机存取存储器 OLTP 它是包含在 SQL Server 2 ...

  10. OWIN与Katana

    OWIN与Katana详解   前言 我胡汉三又回来了,!!!!, 最近忙成狗,实在没空写博文,实在对不起自己,博客园上逛了逛发现 我大微软还是很给力的 asp.net core 1.0 .net c ...