最近有接到一个功能开发,就是在锁屏界面显示未读短信和未接电话,并且每条都滑动解锁进入相应处理程序。
未读短信就进入短信列表,未接电话就进入未接电话列表。项目太大,不方便分析,我这里就直接按小功能剥离分析下一个子功能:
为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及点击事件,挺划算的。