阴晴判断-光线传感器 光线传感器
(1)我介绍的是光线感应器(LightSensor),所谓的光线感应器就是可以感应光线强度的一个设备,而我们对他的开发一般是通过感应光线强度的变化。因为这篇文章是android常用的硬件感应器为主题的,那么我就来介绍怎样在android系统使用光线感应器,我说的真机,因为模拟并没有能够模拟出感应器的效果。。
(2)首先android通过一个SensorManager来管理各种感应器,而获得这个管理器的引用必须通过(SensorManager)getSystemService(Context.SENSOR_SERVICE);这句代码来获得。
(3)在android系统中所有的感应器都属于Sensor类的一个实例,并没有继续细分下去,通过这次的主题,你也会发现android对于感应器的处理几乎是一摸一样的。既然都是Sensor类,那么怎么获得相应的感应器呢?这时就需要通过SensorManager来获得,我们通过这句代码来确定我们要获得感应器类型.
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
很显然我获得的是光线感应器的引用.
(4)既然已经获得相应的感应器的引用,那么我们的怎么用呢?在第一部分我就说到了我们通过感应光线强度的变化,注意是‘变化’。有些人获取已经明白了,既然是变化,我们肯定需要通过监听他,来获得变化。因为我们就需要给我们的感应器加个监听,android提供了两个监听一个是SensorEventListener,另一个SensorListener,因为后者已经在androidAPI上显示过时了,那么我们就不介绍他了。
(5)知道了有哪些感应器监听,那么我们就来介绍下如何给感应器加监听,这时又需要SensorManager,他就是感应器的保姆,很多关于感应器的部分都要靠他。
SensorManager关于加监听的方法有几个:
registerListenr(SensorListener
listenr,intsensors,intrate):已过时
registerListenr(SensorListener
listenr,intsensors):已过时
registerListenr(SensorEventListener
listenr,Sensorsensors,intrate)
registerListenr(SensorEventListener
listenr,Sensorsensors,intrate,Handlerhandler)
因为SensorListener已经过时,那么相应的注册方法,也就过时了。
说下各个参数的意义:
Listener:相应监听器的引用
Sensor:相应的感应器引用
Rate:感应器的反应速度,这个必须是系统提供4个常量之一的:
SENSOR_DELAY_NORMAL:匹配屏幕方向的变化
SENSOR_DELAY_UI:匹配用户接口
SENSOR_DELAY_GAME:匹配游戏
SENSOR_DELAY_FASTEST.:匹配所能达到的最快
Handler:
(6)
要注意的是在android中注册了感应器,也就启用了他,而使用感应器是相当耗电的,这些是为什么感应器的应用没有那么泛滥的主要原因,所以我们必须在我们不需要他的时候,关掉他。怎么关闭呢?注册是启用,那么注销就是关闭了。Android有以下一些注销方法:
unregisterListener(SensorListenerlistener):已过时
unregisterListener(SensorListenerlistener,intsensors):已过时
unregisterListener(SensorEventListenerlistener);
unregisterListener(SensorEventListenerlistener,Sensorsensor);
相应的参数作用,我相信大家也就知道了。
(7)
知道开和关,那么现在就来介绍具体的用!也就是关于SensorEventListener的实现,实现这个监听器必须实现两个方法:一个是onAccuracyChanged(Sensorsensor,intaccuracy),另一个是onSensorChanged(SensorEventevent)。第一个方法是反应速度变化的方法,也就是第五部分的rate变化时的方法.另一个是感应器的值变化的相应的方法。但是需要注意的是,这两个方法是响应的是一起,就是说当感应器发生变化,两个方法都会一起被调用。
下面我介绍下:accuracy的值,也就是那四个常量相应的整数:
SENSOR_DELAY_NORMAL:3
SENSOR_DELAY_UI:2
SENSOR_DELAY_GAME:1
SENSOR_DELAY_FASTEST.:0
讲了一大堆废话,现在介绍SensorEvent类:
他有四个成员变量:
Accuracy:精确值
Sensor:发生变化的感应器
Timestamp:发生的时间,单位是纳秒
Values:发生变化后的值,这个是一个长度为3数组
光线感应器只需要values[0]的值,其他两个都为0.
而values[0]就是我们开发光线感应器所需要的,单位是:lux照度单位
想知道lux的可以查下百度百科:http://baike.baidu.com/view/965777.htm
而android提供了8个不同情况下的:
LIGHT_NO_MOON:晚上没月亮时的lux值==0.001
LIGHT_FULLMOON:晚上满月时的lux值==0.25
LIGHT_CLOUDY:多云天气下的lux值==100.0
LIGHT_SUNRISE:黎明时的lux值==400.0
LIGHT_OVERCAST:阴天的lux值==10000.0
LIGHT_SHADE:阴影下的lux值==20000.0
LIGHT_SUNLIGHT:阳光下的lux值==110000.0
LIGHT_SUNLIGHT_MAX:阳光下的最大lux值==120000.0
大家可以参照这些数据,做出一些相应的应用。
光线传感器演示1
讲了一大堆的理论,那么下面的例子就来展示一下光线感应器的使用.为什么充分展现光感的使用方法,我这个例子写的非常简单,只写了使用光感必须的代码,然后用了几个textView将光线变化的值展现到用户界面。让使用者可以随时的看到光度的变化。
publicclassLightDemoActivityextendsActivityimplementsSensorEventListener{
/**Calledwhentheactivityisfirstcreated.*/
SensorManagersensorManager=null;//传感器管理器引用
SensorlightSensor=null;//光线传感器引用
//各个文本的引用
TextViewaccuracy_view=null;
TextViewvalue_0=null;
TextViewvalue_1=null;
TextViewvalue_2=null;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得传感器管理器实例
sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
//获得光线传感器实例
lightSensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
//获得各个TextView
accuracy_view=(TextView)findViewById(R.id.accuracy);
value_0=(TextView)findViewById(R.id.value_0);
value_1=(TextView)findViewById(R.id.value_1);
value_2=(TextView)findViewById(R.id.value_2);
}
@Override
protectedvoidonPause(){
//TODOAuto-generatedmethodstub
super.onPause();
//注销
sensorManager.unregisterListener(this,lightSensor);
}
@Override
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
super.onResume();
//为传感器管理器注册监听
sensorManager
.registerListener(this,lightSensor,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){
//TODOAuto-generatedmethodstub
if(sensor.getType()==Sensor.TYPE_LIGHT)
{
//设置将accuracy的值显示到屏幕上
accuracy_view.setText("accuracy:"+accuracy);
}
}
@Override
publicvoidonSensorChanged(SensorEventevent){
//TODOAuto-generatedmethodstub
if(event.sensor.getType()==Sensor.TYPE_LIGHT)
{
//将values的值显示到屏幕上
float[]values=event.values;
value_0.setText("value[0]:"+values[0]);
value_1.setText("value[1]:"+values[1]);
value_2.setText("value[2]:"+values[2]);
}
}
}
下面讲解代码:
//获得传感器管理器实例
sensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
//获得光线传感器实例
lightSensor=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
这段代码的作用是获得感应器管理器引用,并获得光感感应器应用。
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
super.onResume();
//为传感器管理器注册监听
sensorManager
.registerListener(this,lightSensor,SensorManager.SENSOR_DELAY_NORMAL);
}
这段代码的作用在resume的时候重新注册监听,开启光感
protectedvoidonPause(){
//TODOAuto-generatedmethodstub
super.onPause();
//注销
sensorManager.unregisterListener(this,lightSensor);
}
这段代码的作用是在暂停时注销监听,关闭光感。因为感应器耗电,所以在不用的时候应该关闭他
if(event.sensor.getType()==Sensor.TYPE_LIGHT)
{
//将values的值显示到屏幕上
float[]values=event.values;
value_0.setText("value[0]:"+values[0]);
value_1.setText("value[1]:"+values[1]);
value_2.setText("value[2]:"+values[2]);
}
}
这段代码的作用判断发生改变的是否为光感感应器,然后获得光度值,并将它输出到textView上
光线传感器演示2
第二个例子就是关于光感的具体运用了。因为我现在的所在地正在下雨,我就想说,用光感写一个晴天娃娃。大家都知道动画片里的晴天娃娃可以会因为天气的不同而改变表情。那么我们就可以通过感应光线强度来确定当前的天气情况,并且改变成相应的图片。而想要效果就像手机的晴天娃娃,那么使用widget技术来显示图片,效果就比较有趣了,有时看下手机因为天气而愁眉苦脸,或者开心,也是一件有趣的事。
在demo里面用到了3个类,分别是LightSensorActivity类,MyUpdateService类,UpdateImage类。下面介绍各个类得作用
LightSensorActivity:开启更新服务,关闭更新服务,和让用户输入更新的时间。注:因为开启感应器是耗电的。我们应该让用户可以有选择的余地。
MyUpdateService:这个服务使用了光感,通过判断光度的值,来发送不同的值.通过开启一个线程,不断的发送广播
UpdateImage:通过受到广播,并获得不同值,这些值代表了不同图片。更新widget的图片。
LightSensorActivity.java
packagecom.wjh.mm;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassLightSensorActivityextendsActivityimplementsOnClickListener{
/**Calledwhentheactivityisfirstcreated.*/
Buttonstart_btn=null;
Buttonstop_btn=null;
EditTexttime_edit=null;
Intentintent=null;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start_btn=(Button)findViewById(R.id.start_btn);
stop_btn=(Button)findViewById(R.id.stop_btn);
time_edit=(EditText)findViewById(R.id.time_edit);
start_btn.setOnClickListener(this);
stop_btn.setOnClickListener(this);}
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(v==start_btn)
{
Stringtime=time_edit.getText().toString();
Log.d("timeStr",time);
inttimeInt=1000;
if(time!=null&&!time.equals(""))
{
timeInt=Integer.parseInt(time);
}else
{
timeInt=1000;
}
Log.d("timeInt",timeInt+"");
if(intent==null)
{
intent=newIntent(LightSensorActivity.this,MyUpdateService.class);
intent.putExtra("time",timeInt);
startService(intent);
}else
{
showToast(this,"这个服务已经开启");
}
}elseif(v==stop_btn)
{
if(intent!=null)
{
stopService(intent);
intent=null;
}else
{
showToast(this,"服务还未开启");
}}}
privatevoidshowToast(Contextcontext,Stringstr)
{
Toast.makeText(context,str,Toast.LENGTH_SHORT).show();
}}
OnClick方法里面代码的作用是判断点击的那个按钮,如果是开始服务按钮,就获得EditText中用户输入的更新时间值,并发送MyUpdateService服务,并开启这个服务。如果是关闭服务按钮,则关闭服务。
MyUpdateService.java
packagecom.wjh.mm;
importandroid.app.Service;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.hardware.Sensor;
importandroid.hardware.SensorEvent;
importandroid.hardware.SensorEventListener;
importandroid.hardware.SensorManager;
importandroid.os.IBinder;
importandroid.util.Log;
publicclassMyUpdateServiceextendsService{
MyThreadmyThread=null;
booleanflag=true;
inttime=1000;
publicIBinderonBind(Intentintent){
//TODOAuto-generatedmethodstub
//获得更新时间,开启线程进行更新
returnnull;}
@Override
publicvoidonStart(Intentintent,intstartId){
//TODOAuto-generatedmethodstub
super.onStart(intent,startId);
time=intent.getIntExtra("time",1000);
Log.d("time",time+"");
MyThreadmyThread=newMyThread();
myThread.start();}
@Override
publicvoidonDestroy(){
//TODOAuto-generatedmethodstub
super.onDestroy();
flag=false;}
classMyThreadextendsThreadimplementsSensorEventListener{
intselect=0;
//获得感应器管理器和光线感应器
SensorManagersensorManager=
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensorlight=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
publicvoidrun()
{
//注册
sensorManager.registerListener(this,light,SensorManager.SENSOR_DELAY_UI);
while(flag)
{
//发送广播
Intentintent=newIntent("com.wjh.mm");
intent.putExtra("select",select);
sendBroadcast(intent);
try{
Thread.sleep(time);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
//注销
sensorManager.unregisterListener(this);
}
}
//注销
sensorManager.unregisterListener(this);}
@Override
publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){
//TODOAuto-generatedmethodstub}
@Override
publicvoidonSensorChanged(SensorEventevent){
//TODOAuto-generatedmethodstub
if(event.sensor.getType()==Sensor.TYPE_LIGHT)
{
//获得相应的光的强度值,并设置图片
floatvalue=event.values[0];
if(value<=SensorManager.LIGHT_CLOUDY)
{
select=0;//如果是多云,就选择0
}elseif(value>SensorManager.LIGHT_CLOUDY&&value<=SensorManager.LIGHT_SUNRISE)
{
select=1;//如果是凌晨,就选择1
}elseif(value>SensorManager.LIGHT_SUNRISE&&value<=SensorManager.LIGHT_OVERCAST)
{
select=2;//如果是阴天就选择2
}elseif(value>SensorManager.LIGHT_OVERCAST&&value<=SensorManager.LIGHT_SHADE)
{
select=3;//如果是阴影下,就选择3
}elseif(value>SensorManager.LIGHT_SHADE&&value<=SensorManager.LIGHT_SUNLIGHT)
{
select=4;//如果晴天,就选择4
}}}}}
publicvoidonStart(Intentintent,intstartId){
//TODOAuto-generatedmethodstub
super.onStart(intent,startId);
time=intent.getIntExtra("time",1000);
Log.d("time",time+"");
MyThreadmyThread=newMyThread();
myThread.start();}
这段代码的作用是获得受到更新时间,并开启一个发送广播线程
SensorManagersensorManager=(SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensorlight=sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
这段代码的作用是获得感应器管理器,并获得光感感应器引用
if(event.sensor.getType()==Sensor.TYPE_LIGHT)
{
//获得相应的光的强度值,并设置图片
floatvalue=event.values[0];
if(value<=SensorManager.LIGHT_CLOUDY)
{
select=0;//如果是多云,就选择0
}elseif(value>SensorManager.LIGHT_CLOUDY&&value<=SensorManager.LIGHT_SUNRISE)
{
select=1;//如果是凌晨,就选择1
}elseif(value>SensorManager.LIGHT_SUNRISE&&value<=SensorManager.LIGHT_OVERCAST)
{
select=2;//如果是阴天就选择2
}elseif(value>SensorManager.LIGHT_OVERCAST&&value<=SensorManager.LIGHT_SHADE)
{
select=3;//如果是阴影下,就选择3
}elseif(value>SensorManager.LIGHT_SHADE&&value<=SensorManager.LIGHT_SUNLIGHT)
{
select=4;//如果晴天,就选择4
}}
这段代码的作用是获得光度的值value,并判断其值,来改变图片的选择值select.
while(flag)
{//发送广播
Intentintent=newIntent("com.wjh.mm");
intent.putExtra("select",select);
sendBroadcast(intent)
try{
Thread.sleep(time);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
//注销
sensorManager.unregisterListener(this);
}}
光线传感器演示2
第二个例子就是关于光感的具体运用了。因为我现在的所在地正在下雨,我就想说,用光感写一个晴天娃娃。大家都知道动画片里的晴天娃娃可以会因为天气的不同而改变表情。那么我们就可以通过感应光线强度来确定当前的天气情况,并且改变成相应的图片。而想要效果就像手机的晴天娃娃,那么使用widget技术来显示图片,效果就比较有趣了,有时看下手机因为天气而愁眉苦脸,或者开心,也是一件有趣的事。
在demo里面用到了3个类,分别是LightSensorActivity类,MyUpdateService类,UpdateImage类。下面介绍各个类得作用
LightSensorActivity:开启更新服务,关闭更新服务,和让用户输入更新的时间。注:因为开启感应器是耗电的。我们应该让用户可以有选择的余地。
MyUpdateService:这个服务使用了光感,通过判断光度的值,来发送不同的值.通过开启一个线程,不断的发送广播
UpdateImage:通过受到广播,并获得不同值,这些值代表了不同图片。更新widget的图片。
下面给出结构图:
下面讲解代码:
LightSensorActivity.java
package com.wjh.mm;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class LightSensorActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */
Button start_btn = null;
Button stop_btn = null;
EditText time_edit = null;
Intent intent = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start_btn = (Button)findViewById(R.id.start_btn);
stop_btn = (Button)findViewById(R.id.stop_btn);
time_edit = (EditText)findViewById(R.id.time_edit);
start_btn.setOnClickListener(this);
stop_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v == start_btn)
{
String time = time_edit.getText().toString();
Log.d("timeStr", time);
int timeInt = 1000;
if(time!=null&&!time.equals(""))
{
timeInt = Integer.parseInt(time);
}else
{
timeInt = 1000;
}
Log.d("timeInt", timeInt+"");
if(intent == null)
{
intent = new Intent(LightSensorActivity.this,MyUpdateService.class);
intent.putExtra("time", timeInt);
startService(intent);
}else
{
showToast(this, "这个服务已经开启");
}
}else if(v == stop_btn)
{
if(intent!=null)
{
stopService(intent);
intent =null;
}else
{
showToast(this,"服务还未开启");
}
}
}
private void showToast(Context context,String str)
{
Toast.makeText(context,str,Toast.LENGTH_SHORT).show();
}
}
复制代码
OnClick方法里面代码的作用是判断点击的那个按钮,如果是开始服务按钮,就获得EditText中用户输入的更新时间值,并发送MyUpdateService服务,并开启这个服务。如果是关闭服务按钮,则关闭服务。
///////////////////////////////////////////////
MyUpdateService.java
package com.wjh.mm;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.IBinder;
import android.util.Log;
public class MyUpdateService extends Service{
MyThread myThread = null;
boolean flag = true;
int time = 1000;
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
//获得更新时间,开启线程进行更新
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
time = intent.getIntExtra("time", 1000);
Log.d("time", time+"");
MyThread myThread = new MyThread();
myThread.start();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
flag = false;
}
class MyThread extends Thread implements SensorEventListener{
int select = 0;
//获得感应器管理器和光线感应器
SensorManager sensorManager =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensor light = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
public void run()
{
//注册
sensorManager.registerListener(this, light, SensorManager.SENSOR_DELAY_UI);
while(flag)
{
//发送广播
Intent intent = new Intent("com.wjh.mm");
intent.putExtra("select", select);
sendBroadcast(intent);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//注销
sensorManager.unregisterListener(this);
}
}
//注销
sensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if(event.sensor.getType() == Sensor.TYPE_LIGHT)
{
//获得相应的光的强度值,并设置图片
float value = event.values[0];
if(value<=SensorManager.LIGHT_CLOUDY)
{
select = 0;//如果是多云,就选择0
}else if(value>SensorManager.LIGHT_CLOUDY && value<=SensorManager.LIGHT_SUNRISE)
{
select = 1;//如果是凌晨,就选择1
}else if(value>SensorManager.LIGHT_SUNRISE && value<=SensorManager.LIGHT_OVERCAST)
{
select = 2;//如果是阴天就选择2
}else if(value>SensorManager.LIGHT_OVERCAST && value<=SensorManager.LIGHT_SHADE)
{
select = 3;//如果是阴影下,就选择3
}else if(value>SensorManager.LIGHT_SHADE && value<=SensorManager.LIGHT_SUNLIGHT)
{
select = 4;//如果晴天,就选择4
}
}
}
}
}
//////////////////////////////////////
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
time = intent.getIntExtra("time", 1000);
Log.d("time", time+"");
MyThread myThread = new MyThread();
myThread.start();
}
这段代码的作用是获得受到更新时间,并开启一个发送广播线程
/////////////////////////////////////
SensorManager sensorManager =
(SensorManager)getSystemService(Context.SENSOR_SERVICE);
Sensor light = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
这段代码的作用是获得感应器管理器,并获得光感感应器引用
/////////////////////////////////////
if(event.sensor.getType() == Sensor.TYPE_LIGHT)
{
//获得相应的光的强度值,并设置图片
float value = event.values[0];
if(value<=SensorManager.LIGHT_CLOUDY)
{
select = 0;//如果是多云,就选择0
}else if(value>SensorManager.LIGHT_CLOUDY && value<=SensorManager.LIGHT_SUNRISE)
{
select = 1;//如果是凌晨,就选择1
}else if(value>SensorManager.LIGHT_SUNRISE && value<=SensorManager.LIGHT_OVERCAST)
{
select = 2;//如果是阴天就选择2
}else if(value>SensorManager.LIGHT_OVERCAST && value<=SensorManager.LIGHT_SHADE)
{
select = 3;//如果是阴影下,就选择3
}else if(value>SensorManager.LIGHT_SHADE && value<=SensorManager.LIGHT_SUNLIGHT)
{
select = 4;//如果晴天,就选择4
}
}
复制代码
这段代码的作用是获得光度的值value,并判断其值,来改变图片的选择值select.
///////////////////////////////////////////////
while(flag)
{
//发送广播
Intent intent = new Intent("com.wjh.mm");
intent.putExtra("select", select);
sendBroadcast(intent);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//注销
sensorManager.unregisterListener(this);
}
}
复制代码
这段代码的作用将图片选择的值select的值通过广播发送出去,通过一个无限循环,不断的发送。
////////////////////////////////
package com.wjh.mm;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
public class UpdateImage extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
// TODO Auto-generated method stub
update(context,appWidgetManager,appWidgetIds,0);
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
//获得图片下标
int position = intent.getIntExtra("select", 0);
//更新
update(context, null, null,position);
}
public static void update(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds,int position)
{
//图片数组
int[] imageIds ={R.drawable.p1,R.drawable.p2,
R.drawable.p3,R.drawable.p4,R.drawable.p5};
//更新View
RemoteViews remoteView =
new RemoteViews(context.getPackageName(), R.layout.table_layout);
//设置图片
remoteView.setImageViewResource(R.id.imageView1,imageIds[position]);
//名字
ComponentName name = new ComponentName(context,UpdateImage.class);
//更新
AppWidgetManager appWidgetManager2 = AppWidgetManager.getInstance(context);
appWidgetManager2.updateAppWidget(name, remoteView);
}
}
///////////////////////////////////
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
super.onReceive(context, intent);
//获得图片下标
int position = intent.getIntExtra("select", 0);
//更新
update(context, null, null,position);
}
复制代码
这段代码的作用,接受受到的信息,并且调用update方法,进行更新
/////////////////////////////////////
public static void update(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds,int position)
{
//图片数组
int[] imageIds ={R.drawable.p1,R.drawable.p2,
R.drawable.p3,R.drawable.p4,R.drawable.p5};
//更新View
RemoteViews remoteView =
new RemoteViews(context.getPackageName(), R.layout.table_layout);
//设置图片
remoteView.setImageViewResource(R.id.imageView1,imageIds[position]);
//名字
ComponentName name = new ComponentName(context,UpdateImage.class);
//更新
AppWidgetManager appWidgetManager2 = AppWidgetManager.getInstance(context);
appWidgetManager2.updateAppWidget(name, remoteView);
}
复制代码
这段代码的作用创建图片数组,创建RemoteView实例,我们通过使用remoteView设置图片来设置widget的图片,并通过AppWidgetManager进行更新
更多阅读
女性美容知识大全 美容护肤知识大全
女性美容知识大全——简介 “爱美之心人皆有之”,对美的追求,一直令女性为之疯狂。美丽除了气质以外,最重要的就是皮肤美丽。现在就让上海5+5的陈主任给大家介绍一些女性美容知识。女性美容知识大全——方法/步骤女性美容知识大全 1、
钓鱼技巧全攻略 钓鱼小药秘籍
“内行看门道,外行看热闹”,讲的就是看招。会看,鱼情水情,一目了然;不会看,黑山白水,满眼疑云。会看与不会看,钓技自分高低。钓鱼有八大招式,如能运用自如,自然好处多多。现将八大要招主要做法介绍如下。 一、看天气. 自古以来,
山有木兮木有枝,心悦君兮君不知 类似于山有木兮木有枝
山有木兮木有枝,心悦君兮君不知。一缕钨丝现光明,人间至此隐黑暗。冥冥之中自有天意,正所谓千里姻缘一线牵,有缘千里来相会,无缘对面不相逢。不愿与其共享之,只愿与君齐享之。众里寻他千百度,暮然回首那人却在灯火阑珊时。自古英雄难过美人
情歌变得不好听。 情歌变的不好听
心情不好时,总爱听情歌,听着听着,就开始流泪。我的心像大雨将至那么潮湿。我就像天气一样,阴晴不定。我会很爱很爱未来的那个你,和你一直一直在一起。总会有那么一个人,会等着我,爱着我。我说,我不会再为任何人等待,不会再为任何人停留
作文-人有悲欢离合,月有阴晴圆缺 悲欢离合类似的成语
花雪飘零,大地被白茫茫的雪花覆盖着。维多利加呆在课室里搓着小手,放在嘴前呵气。放眼望去,窗外的雪景耀眼动人,几个小孩在雪堆里玩着打雪仗,小孩灿烂的笑容给寒冷的冬天带来了一丝丝暖意。然而维多利加并没注意到那悄悄靠静的脚步,他仍然