android开发-仿乐桌面四叶草

 声明:本人是个技术宅,, 写文章不懂得玩什么文字游戏,所以直接进入主题咯~~~


              关于appwidget的基础知识,请自行度娘。


             学习appwidget几天了,将自己手机上的四叶草控件给仿制了一个,拖出来给有需要的朋友分享,

             (注意:代码没有做过兼容性测试,测试机子是联想a789,分辨率:480*800。)


效果图如下:

                       

                                   初始界面                                              设置界面                                                 设置后的界面

      

             点击中间那个按钮,即可进入设置界面。O(∩_∩)O~


            我的开发环境是eclipse,考略到贴出所有代码的话文字篇幅可能过大,,所以,决定只贴出部分核心代码,详细的大家直接下载源码去看好了:

            

            图片资源我是自己PS画出来的,直接做成了透明效果,,这样就省去敲代码了。。。大笑


 程序有3个java文件:activityctrl.java,mainactivity,quicklinklist.java


                 activityctrl.java:用于判断appwidget是否已经进行过设置,,如果已经进行过设置则直接运行app,否则,进入配置界面;

             mainactivity.java:继承appwidgetprovider,负责更新、设置appwidget;

            quicklinklist.java:提供动态配置appwidget的类。


           

mainactivity.java代码:

public class MainActivity extends AppWidgetProvider {

	private AppWidgetManager appWidgetManager = null;
	public static Context context = null;
	private int[] appWidgetIDs = null;

	public static int[] ctrl_ID = new int[] { R.id.IB_UpBtn_Left,
			R.id.IB_UpBtn_Right, R.id.IB_DownBtn_Left, R.id.IB_DownBtn_Right,
			R.id.IB_Btn_Center };

	@Override
	public void onUpdate(Context context, AppWidgetManager appWidgetManager,
			int[] appWidgetIds) {
		// TODO Auto-generated method stub
		this.appWidgetManager = appWidgetManager;
		this.appWidgetIDs = appWidgetIds;
		this.context = context;

		msgThread.start();

		// 获得view
		RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
				R.layout.activity_main);

		String tmp = null;

                //循环加载图标
		for (int z = 0; z < 4; z++) {

                        //z代表四个按钮控件
			SharedPreferences sf = context.getSharedPreferences(
					String.valueOf(z), Activity.MODE_PRIVATE);

			tmp = sf.getString("PackName", "");

			try {
                                如果包名不为空,设置图标
				if (tmp != "") {

					PackageInfo packinfo = context.getPackageManager()
							.getPackageInfo(tmp, 0);
                                          //设置图标
					remoteViews.setImageViewBitmap(ctrl_ID[z], quicklinklist
							.DrawableToBitmap(packinfo.applicationInfo
									.loadIcon(context.getPackageManager())));
				}

			} catch (NameNotFoundException e) {
				// TODO Auto-generated catch block
				Toast.makeText(context, "什么也没找到!!!", Toast.LENGTH_SHORT).show();
			}

		}


		// 获得创建的appwidget
		ComponentName componentName = new ComponentName(context,
				MainActivity.class);

		// 更新视图
		appWidgetManager.updateAppWidget(componentName, remoteViews);

		super.onUpdate(context, appWidgetManager, appWidgetIds);

	}

	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub

			switch (msg.what) {
			case 1:

				int n = appWidgetIDs.length;
				int j = 0;

				for (int i = 0; i < n; i++) {

					j = appWidgetIDs[i];
					RemoteViews views = new RemoteViews(
							context.getPackageName(), R.layout.activity_main);

					for (int z = 0; z < ctrl_ID.length; z++) {

						Intent intent = new Intent(context, activityctrl.class);
						// intent.setAction(MSG_ID[z]);

						intent.putExtra("pos", z);

						// intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
						// j);

						/*PendingIntent.getBroadcast(context,requestCode,intent,flags)
						 * 
						     参数说明:context----->上下文
						           requestCode----->响应码,可用于区分多个PendingIntent实例
						           intent----->希望执行的动作
						           flags----->标记
						*/

						PendingIntent pi = PendingIntent.getActivity(context,
								z, intent, 0);

						// PendingIntent pi =
						// PendingIntent.getActivity(context,z, intent,
						// PendingIntent.FLAG_UPDATE_CURRENT);

						views.setOnClickPendingIntent(ctrl_ID[z], pi);

					}

					appWidgetManager.updateAppWidget(j, views);
				}
				break;
			}
			super.handleMessage(msg);
		}
	};

	Thread msgThread = new Thread() {

		@Override
		public void run() {

			Message msg = new Message();
			msg.what = 1;
			handler.sendMessage(msg);

		};
	};

}


activityctrl.java代码:

public class activityctrl extends Activity {

	int cur_position = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		cur_position = (Integer) getIntent().getSerializableExtra("pos");

		String packname = this.getPackName(cur_position);

		if (packname != "" && cur_position <= 3) {

			try {

				Intent intent = getPackageManager().getLaunchIntentForPackage(
						packname);

				startActivity(intent);

				this.finish();

			} catch (Exception e) {
				Toast.makeText(this, "不能独立运行程序或者程序已经卸载!", Toast.LENGTH_SHORT)
						.show();
			}
		} else {

			Intent intent = new Intent(activityctrl.this, quicklinklist.class);
			intent.putExtra("pos", cur_position);
			startActivity(intent);

		}

		this.finish();
	}

	public String getPackName(int position) {

		SharedPreferences sf = getSharedPreferences(String.valueOf(position),
				Activity.MODE_PRIVATE);

		return sf.getString("PackName", "");

	}

}


quicklinklist.java代码:

public class quicklinklist extends Activity {

	private ListView LV_quickLink = null;
	private ImageView IV_ItemView = null;

	private static Context context = null;
	private int cur_position = 0;

	private List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
	private List<HashMap<String, Object>> appdata = new ArrayList<HashMap<String, Object>>();

	List<PackageInfo> pckman = null;

	private View g_itemsView = null;

	Button btn_over = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub

		super.onCreate(savedInstanceState);

		cur_position = (Integer) getIntent().getSerializableExtra("pos");

		this.context = this;

		setContentView(R.layout.quicklinklist);

		btn_over = (Button) this.findViewById(R.id.btn_over);

		btn_over.setOnClickListener(new android.view.View.OnClickListener() {

			@Override
			public void onClick(View view) {
				// TODO Auto-generated method stub

				quicklinklist.this.finish();

			}
		});

		// setTheme(android.R.style.Theme_NoTitleBar);

		pckman = (List<PackageInfo>) getPackageManager()
				.getInstalledPackages(0);

		LV_quickLink = (ListView) findViewById(R.id.LV_quickLink);

		String[] menu_name_list = context.getResources().getStringArray(
				R.array.menulist_name);

		// data.clear();

		String tmp = null;

		for (int i = 0; i < menu_name_list.length; i++) {

			HashMap<String, Object> hash = new HashMap<String, Object>();

			SharedPreferences sf = context.getSharedPreferences(
					String.valueOf(i), Activity.MODE_PRIVATE);

			tmp = sf.getString("PackName", "");

			try {

				if (tmp != "") {

					PackageInfo packinfo = context.getPackageManager()
							.getPackageInfo(tmp, 0);

					hash.put("icon", DrawableToBitmap(packinfo.applicationInfo
							.loadIcon(context.getPackageManager())));

				} else {
					hash.put("icon", BitmapFactory.decodeResource(
							getResources(), R.drawable.ic_launcher));
				}

			} catch (NameNotFoundException e) {
				// TODO Auto-generated catch block
				Toast.makeText(context, "什么也没找到!!!", Toast.LENGTH_SHORT).show();
			}

			hash.put("name", menu_name_list[i]);

			data.add(hash);

		}

		SimpleAdapter sa = new SimpleAdapter(this, data,
				R.layout.listitems_list, new String[] { "name", "icon" },
				new int[] { R.id.TV_MenuName_list, R.id.IV_AppIcon_list });

		sa.setViewBinder(new ViewBinder() {

			@Override
			public boolean setViewValue(View view, Object data,
					String textRepresentation) {
				// TODO Auto-generated method stub

				if (view instanceof ImageView) {

					ImageView iv = (ImageView) view;

					iv.setImageBitmap((Bitmap) data);

					return true;
				} else {

					return false;
				}

			}

		});

		LV_quickLink.setAdapter(sa);

		final Handler handler = new Handler() {

			public void handleMessage(Message msg) {

				switch (msg.what) {
				case 0:

					int count = pckman.size();

					appdata.clear();

					for (int i = 0; i < count; i++) {
						PackageInfo packinfo = pckman.get(i);

						HashMap<String, Object> hash = new HashMap<String, Object>();

						hash.put(
								"appname",
								packinfo.applicationInfo.loadLabel(
										getPackageManager()).toString());
						hash.put("icon", packinfo.applicationInfo
								.loadIcon(getPackageManager()));
						hash.put("packname",
								packinfo.applicationInfo.packageName.toString());

						appdata.add(hash);

					}

					final SimpleAdapter sa = new SimpleAdapter(context,
							appdata, R.layout.listitems, new String[] {
									"appname", "icon" }, new int[] {
									R.id.TV_MenuName, R.id.IV_AppIcon });

					sa.setViewBinder(new ViewBinder() {

						@Override
						public boolean setViewValue(View view, Object data,
								String textRepresentation) {
							// TODO Auto-generated method stub

							if (view instanceof ImageView) {

								ImageView iv = (ImageView) view;

								iv.setImageDrawable((Drawable) data);

								return true;
							} else {

								return false;
							}

						}

					});

					new AlertDialog.Builder(context).setTitle("选择程序")

					.setAdapter(sa, new OnClickListener() {

						@Override
						public void onClick(DialogInterface dlg, int which) {
							// TODO Auto-generated method stub

							Bitmap img = DrawableToBitmap((Drawable) appdata
									.get(which).get("icon"));

							savePackName(appdata.get(which).get("packname")
									.toString());

							// 获取远程view
							RemoteViews remoteViews = new RemoteViews(
									MainActivity.context.getPackageName(),
									R.layout.activity_main);

							// 设置图标
							remoteViews.setImageViewBitmap(
									MainActivity.ctrl_ID[cur_position], img);

							// 获取appwidgetmanager实例
							AppWidgetManager appWidgetManager = AppWidgetManager
									.getInstance(MainActivity.context);

							// 获得所有appwidget
							ComponentName componentName = new ComponentName(
									context, MainActivity.class);

							// 更新appwidget
							appWidgetManager.updateAppWidget(componentName,
									remoteViews);

							IV_ItemView = (ImageView) g_itemsView
									.findViewById(R.id.IV_AppIcon_list);

							IV_ItemView.setImageBitmap(img);

							// quicklinklist.this.finish();

						}
					}).show();

					break;

				}
			};
		};

		LV_quickLink.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> adapterview, View view,
					int position, long id) {
				// TODO Auto-generated method stub

				g_itemsView = view;

				cur_position = position;

				new Thread() {
					@Override
					public void run() {
						// TODO Auto-generated method stub
						super.run();

						Message msg = new Message();

						msg = handler.obtainMessage();

						msg.what = 0;

						msg.sendToTarget();

					}
				}.start();

			}
		});

	}

	public void savePackName(String PackName) {

		SharedPreferences sf = getSharedPreferences(
				String.valueOf(cur_position), Activity.MODE_PRIVATE);

		SharedPreferences.Editor sf_editor = sf.edit();

		sf_editor.putString("PackName", PackName);

		sf_editor.commit();

	}

	public String getPackName(int position) {

		SharedPreferences sf = getSharedPreferences(String.valueOf(position),
				Activity.MODE_PRIVATE);

		return sf.getString("PackName", "");

	}

	public static Bitmap DrawableToBitmap(Drawable drawable) {

		// int w = drawable.getIntrinsicWidth();
		// int h = drawable.getIntrinsicHeight();

		// 转成特定大小,以达到美观效果
		int w = 62;
		int h = 62;

		// 取drawable颜色格式
		Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Config.ARGB_8888
				: Config.RGB_565;

		// 创建位图
		Bitmap img = Bitmap.createBitmap(w, h, config);

		// 创建基于位图的画布
		Canvas canvas = new Canvas(img);

		// 设置大小
		drawable.setBounds(0, 0, w, h);

		// 画到画布上去
		drawable.draw(canvas);

		// 返回位图
		return img;

	}

}



代码如有不对的地方,还望大家指正。

O(∩_∩)O~


源码http://download.csdn.net/detail/flydream3618/7549535


            

By   ——flydream3618

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值