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

最近在做一个应用,主界面是一个日历,网上有很多第三方的日历控件,有使用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);

然后你可以弄一个按钮或者其它的什么,绑定上它的事件,来触发我们切换到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...)



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值