添加自定义View的Widget
2017-02-17 11:28
155 查看
我们widget里面可以使用的控件只有:AnalogClock,Button,Chronometer,ImageButton,mageView,ProgressBar,TextView这7种,要是想用自己自定义的view,必须在frameworks中添加自己自定义的view。
根据AnalogClockWidget控件,自定义了一个DenqinAnalogClockWidget.java,路径 vendor\mediatek\proprietary\frameworks\base\widget\java\com\mediatek\widget。代码顺便贴出来吧
这个自定义的view是根据AnalogClockWidget修改来的,修改了下时针、分针和表盘。其中用到3张图片和字体大小,资源路径vendor\mediatek\proprietary\frameworks\base\res\res\drawable-xhdpi和vendor\mediatek\proprietary\frameworks\base\res\res\values。然后在symbols.xml中声明一下,路径也是vendor\mediatek\proprietary\frameworks\base\res\res\values
然后在Widget布局中直接引用显示就可以了
根据AnalogClockWidget控件,自定义了一个DenqinAnalogClockWidget.java,路径 vendor\mediatek\proprietary\frameworks\base\widget\java\com\mediatek\widget。代码顺便贴出来吧
/* Copyright Statement: * * This software/firmware and related documentation ("MediaTek Software") are * protected under relevant copyright laws. The information contained herein is * confidential and proprietary to MediaTek Inc. and/or its licensors. Without * the prior written permission of MediaTek inc. and/or its licensors, any * reproduction, modification, use or disclosure of MediaTek Software, and * information contained herein, in whole or in part, shall be strictly * prohibited. * * MediaTek Inc. (C) 2010. All rights reserved. * * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. * * The following software/firmware and/or related documentation ("MediaTek * Software") have been modified by MediaTek Inc. All revisions are subject to * any receiver's applicable license agreements with MediaTek Inc. */ package com.mediatek.widget; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.BroadcastReceiver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.PaintFlagsDrawFilter; import android.os.Handler; import android.text.format.DateUtils; import android.text.format.Time; import android.util.AttributeSet; import android.view.View; import android.widget.RemoteViews.RemoteView; import com.mediatek.internal.R; import java.util.TimeZone; /** * @hide */ @RemoteView public class DenqinAnalogClockWidget extends View { private final Paint mPaint = new Paint(); private static final float STROKE_WIDTH = 4f; private static final float STROKE_WIDTH_MS = 3f; private static final float HOUR_RADIUS_SCALE = 0.5f; private static final float MINUTE_RADIUS_SCALE = 0.8f; private static final float OFFSET_RADIUS_SCALE = 0.1f; private static final float RADIUS_SCALE = 0.9f; private Time mCalendar; private float mMinutes; private float mHour; private String mMonthDay; private Bitmap mBgBitmap; private Bitmap mHourBitmap; private Bitmap mMinutesBitmap; private boolean mAttached; private final Handler mHandler = new Handler(); public DenqinAnalogClockWidget(Context context) { this(context, null); } public DenqinAnalogClockWidget(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DenqinAnalogClockWidget(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mCalendar = new Time(); mPaint.setStyle(Style.STROKE); mPaint.setColor(Color.WHITE); mPaint.setAntiAlias(true); mPaint.setTextSize( getContext().getResources().getDimension(R.dimen.month_day_size)); mBgBitmap = BitmapFactory.decodeResource( getContext().getResources(), R.drawable.dial_plate); mHourBitmap = BitmapFactory.decodeResource( getContext().getResources(), R.drawable.hour); mMinutesBitmap = BitmapFactory.decodeResource( getContext().getResources(), R.drawable.minute); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int x = (getRight() - getLeft()) / 2; int y = (getBottom() - getTop()) / 2; float xT; float yT = (float)y + ((float)mBgBitmap.getHeight()) / 70; canvas.setDrawFilter(new PaintFlagsDrawFilter( 0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG)); canvas.drawBitmap(mBgBitmap, x - mBgBitmap.getWidth() / 2, y - mBgBitmap.getHeight() / 2, mPaint); if (mMonthDay.length() == 1) { xT = (float)x + ((float)mBgBitmap.getWidth()) / 7; } else { xT = (float)x + ((float)mBgBitmap.getWidth()) / 8; } canvas.drawText(mMonthDay, xT, yT, mPaint); canvas.save(); canvas.rotate(mHour / 12.0f * 360.0f, x, y); canvas.drawBitmap(mHourBitmap, x - mHourBitmap.getWidth() / 2, y - mHourBitmap.getHeight() / 2, mPaint); canvas.restore(); canvas.save(); canvas.rotate(mMinutes / 60.0f * 360.0f, x, y); canvas.drawBitmap(mMinutesBitmap, x - mMinutesBitmap.getWidth() / 2, y - mMinutesBitmap.getHeight() / 2, mPaint); canvas.restore(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (!mAttached) { mAttached = true; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_TICK); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); getContext().registerReceiverAsUser(mIntentReceiver, android.os.Process.myUserHandle(), filter, null, mHandler); } mCalendar = new Time(); onTimeChanged(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mAttached) { getContext().unregisterReceiver(mIntentReceiver); mAttached = false; } } private void onTimeChanged() { mCalendar.setToNow(); int hour = mCalendar.hour; int minute = mCalendar.minute; int second = mCalendar.second; mMonthDay = Integer.toString(mCalendar.monthDay); mMinutes = minute + second / 60.0f; mHour = hour + mMinutes / 60.0f; updateContentDescription(mCalendar); } private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) { String tz = intent.getStringExtra("time-zone"); mCalendar = new Time(TimeZone.getTimeZone(tz).getID()); } onTimeChanged(); invalidate(); } }; private void updateContentDescription(Time time) { final int flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR; String contentDescription = DateUtils.formatDateTime(mContext, time.toMillis(false), flags); setContentDescription(contentDescription); } }
这个自定义的view是根据AnalogClockWidget修改来的,修改了下时针、分针和表盘。其中用到3张图片和字体大小,资源路径vendor\mediatek\proprietary\frameworks\base\res\res\drawable-xhdpi和vendor\mediatek\proprietary\frameworks\base\res\res\values。然后在symbols.xml中声明一下,路径也是vendor\mediatek\proprietary\frameworks\base\res\res\values
然后在Widget布局中直接引用显示就可以了
<com.mediatek.widget.DenqinAnalogClockWidget xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" />效果图:
相关文章推荐
- android AppWidget中添加自定义View
- 关于自定义View添加到layout文件和ScrollView中无法捕捉onFling事件 3ff8
- 浅谈如何给appwidget添加复杂view
- android 动态添加自定义TextView
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view 上(相当于所有界面都通过xib来实现)
- Android 自定义View并添加属性介绍
- 给CHtmlEditView添加自定义拖拽功能IDropTargetpdwEffectDROPEFFECT_COPY
- android 自定义View研究(二) — 自定义控件添加属性
- Android 自定义View并添加属性
- ViewFlipper添加自定义View失去焦点问题解决
- 为任意自定义的View隐藏时添加动画效果
- Android添加自定义View的方法
- iOS创建不带nib文件的工程之四--在自定义view上添加按钮
- 添加自定义view出现空指针异常
- Iphone在table cell中添加自定义布局view
- UITabBarView 添加自定义图片
- iPhone开发学习笔记005——使用XIB自定义一个UIView,然后将这个view添加到controller的view
- 使用XIB自定义一个UIView,然后将这个view添加到controller的view
- 在一个Activity中同时添加自定义View和系统控件