最近有接到一个功能开发,就是在锁屏界面显示未读短信和未接电话,并且每条都滑动解锁进入相应处理程序。
未读短信就进入短信列表,未接电话就进入未接电话列表。项目太大,不方便分析,我这里就直接按小功能剥离分析下一个子功能:
为ListView内的Item添加解锁事件
(1)首先介绍解锁demo的item布局,整个解锁app主layout就是一个ListView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/itemLayout"
android:layout_width="fill_parent"
android:layout_height="63dip"
android:layout_gravity="center"
android:layout_marginTop="200dip" >
<TextView
android:id="@+id/bgTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="all"
android:textColor="#f8f8f8" >
</TextView>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/bgTextView" >
</Button>
<ImageView
android:id="@+id/moveImage"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="20dip"
android:layout_toRightOf="@id/bgTextView"
android:visibility="invisible" >
</ImageView>
<ImageView
android:id="@+id/getup_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="20dip"
android:background="@anim/slider_tip_anim"
android:visibility="invisible" >
</ImageView>
</RelativeLayout>
布局有点乱,一个相对布局,里面有背景字bgTextView和一个按键btn(测试用,功能无关),一个解锁图标moveImage,和一个滑动解锁动态图getup_arrow。
(2)然后介绍主activity,activity中主要完成对listview的初始化绘图过程。
listView = new ListView(this);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("bg", "解锁查看 10086");
map.put("anim", R.anim.slider_tip_anim);
map.put("move", R.drawable.ic_launcher);
list.add(map);
......
ListAdapter adapter = new ListAdapter(this, list, R.layout.item,
new String[] { "bg", "anim", "move"}, new int[] {
R.id.bgTextView, R.id.getup_arrow, R.id.moveImage });
listView.setItemsCanFocus(false);
listView.setAdapter(adapter);
(3)其中重头戏要来了,那就是自定义的ListAdapter继承自SimpleAdapter,关于解锁和滑动一些细节都是在adapter里面实现的。
重写其getView方法。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
v.setOnTouchListener(new TouchListener());
ViewHolder holder = (ViewHolder) v.getTag();
if (holder == null) {
holder = new ViewHolder();
holder.move = (ImageView) v.findViewById(R.id.moveImage);
holder.btn = (Button)v.findViewById(R.id.btn);
holder.iv = (ImageView) v.findViewById(R.id.getup_arrow);
holder.tv = (TextView) v.findViewById(R.id.bgTextView);
v.setTag(holder);
}
return v;
}
class ViewHolder {
ImageView move;
Button btn;
ImageView iv;
TextView tv;
}
这里获取资源选择用ViewHolder间接获取,
(4)重写OnTouchListener的onTouch方法来绘制滑动解锁图片:
class TouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int x = (int) event.getX();
View imageMove = ((ViewHolder) v.getTag()).move;
View text = ((ViewHolder) v.getTag()).tv;
View image = ((ViewHolder) v.getTag()).iv;
View btn = ((ViewHolder) v.getTag()).btn;
Button button = (Button)btn;
button.setText("TEXT");
ImageView im = (ImageView)imageMove;
ConstantState d = mContext.getResources().getDrawable(R.drawable.getup_slider_ico_pressed).getConstantState();
boolean a = im.getDrawable().getConstantState().equals(d);
//Log.i("Fred"," tv:id = "+Integer.toHexString(tv.getId()));
Log.i("Fred"," iv.getBackground()==d "+ a);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
image.setVisibility(View.VISIBLE);
imageMove.setVisibility(View.VISIBLE);
imageMove.setX(text.getRight());
mLastX = x;
v.invalidate();
return true;
case MotionEvent.ACTION_MOVE:
imageMove.setX(imageMove.getX() + x - mLastX);
mLastX = x;
v.invalidate();
return true;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
image.setVisibility(View.INVISIBLE);
imageMove.setVisibility(View.INVISIBLE);
boolean isSucess = Math.abs(imageMove.getX() - v.getWidth()) <= 150 ;
if(isSucess){
v.invalidate();
Toast.makeText(mContext, "解锁成功", 1000).show();
}else{
int distance = x - imageMove.getRight();
if(distance>0){
v.invalidate();
}else{
mLastX = 1000;
v.invalidate();
}
}
return true;
default:
image.setVisibility(View.INVISIBLE);
imageMove.setVisibility(View.INVISIBLE);
}
return false;
}
}
运行效果就是touch这个listview的某一个item会出现解锁图片和解锁动态,滑动图片至最右,显示解锁成功。
程序demo在这里,小伙伴们施舍1分下载来看看吧,嘿嘿。
里面有ListView的adapter自定义;textView的autolink及点击事件,挺划算的。