更改Calendar的背景图片(使用系统图片选择器)

最近在做一个应用,主界面是一个日历,网上有很多第三方的日历控件,有使用ImageView实现的,有使用GridView实现的,好处是可以灵活的控制.

而我选择了使用原生的CalendarView,关于这个控件,具体可以参考:

缺点是没有提供周分隔线的自定义图片的方法,下面的代码是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 lineint 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的背景:

<CalendarViewandroid: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);然后你可以弄一个按钮或者其它的什么,绑定上它的事件,来触发我们切换到pic选择–>Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(i, 0);这个方法选择完,会回调这个方法,所以你要重写这个–>@Overrideprotected 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 BGSPBGSP 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的背景图片(使用系统图片选择器)

相关文章:

你感兴趣的文章:

标签云: