最近项目中要用到,所以做了个,刚开始做出来,可能有些地方还没有考虑完整,不过可以拿来参考一下。其实最主要的就是使用了一个自定义的BaseAdapter,在其中的getView方法中,为模板中的图片控件增加了onTouchListener事件即可实现。
运行效果如下:
主布局文件:
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:orientation ="vertical" android:layout_width ="fill_parent"
4 android:layout_height ="fill_parent" >
5 < ListView android:id ="@+id/lvDemo" android:layout_width ="fill_parent"
6 android:layout_height ="wrap_content" />
7 </ LinearLayout >
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:orientation ="vertical" android:layout_width ="fill_parent"
4 android:layout_height ="fill_parent" >
5 < ListView android:id ="@+id/lvDemo" android:layout_width ="fill_parent"
6 android:layout_height ="wrap_content" />
7 </ LinearLayout >
主布局文件中列表的项模板如下:
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:layout_width ="fill_parent" android:layout_height ="wrap_content"
4 android:orientation ="horizontal" android:layout_gravity ="center"
5 android:paddingTop ="5dp" android:paddingBottom ="5dp" >
6 < FrameLayout android:id ="@+id/flContainer"
7 android:layout_width ="fill_parent" android:layout_height ="wrap_content" >
8 < TextView android:id ="@+id/tvShowTitle" android:layout_width ="wrap_content"
9 android:layout_height ="wrap_content" android:paddingLeft ="110dp"
10 android:paddingTop ="10dp" android:textSize ="16sp" >
11 </ TextView >
12 < ImageView android:id ="@+id/ivLogo" android:layout_width ="100dp"
13 android:layout_height ="80dp" />
14 < ImageView android:id ="@+id/ivAlphaImg"
15 android:layout_width ="80dp" android:background ="@drawable/pi"
16 android:layout_height ="80dp" />
17 </ FrameLayout >
18 </ LinearLayout >
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:layout_width ="fill_parent" android:layout_height ="wrap_content"
4 android:orientation ="horizontal" android:layout_gravity ="center"
5 android:paddingTop ="5dp" android:paddingBottom ="5dp" >
6 < FrameLayout android:id ="@+id/flContainer"
7 android:layout_width ="fill_parent" android:layout_height ="wrap_content" >
8 < TextView android:id ="@+id/tvShowTitle" android:layout_width ="wrap_content"
9 android:layout_height ="wrap_content" android:paddingLeft ="110dp"
10 android:paddingTop ="10dp" android:textSize ="16sp" >
11 </ TextView >
12 < ImageView android:id ="@+id/ivLogo" android:layout_width ="100dp"
13 android:layout_height ="80dp" />
14 < ImageView android:id ="@+id/ivAlphaImg"
15 android:layout_width ="80dp" android:background ="@drawable/pi"
16 android:layout_height ="80dp" />
17 </ FrameLayout >
18 </ LinearLayout >
自定义适配器:
1
package
com.studio.basf.animationdemo;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5
6 import android.content.Context;
7 import android.util.DisplayMetrics;
8 import android.view.LayoutInflater;
9 import android.view.MotionEvent;
10 import android.view.View;
11 import android.view.View.OnTouchListener;
12 import android.view.ViewGroup;
13 import android.widget.BaseAdapter;
14 import android.widget.ImageView;
15 import android.widget.TextView;
16
17 public class CustomAdapter extends BaseAdapter implements OnTouchListener {
18
19 private LayoutInflater mInflater;
20 private ViewHolder holder;
21 private ArrayList < HashMap < String, String >> list;
22 private int resource, lastX, lastY, vLeft, vTop,vRight, vBottom;
23 private HashMap < String, Object > hashMap;
24 private String[] from;
25 private int [] to;
26 private Context context;
27
28 // 自定义容器类
29 class ViewHolder {
30
31 public ArrayList < ImageView > getIvCollections() {
32 return ivCollections;
33 }
34
35 public void setIvCollections(ArrayList < ImageView > ivCollections) {
36 this .ivCollections = ivCollections;
37 }
38
39 public TextView getTvShowTitle() {
40 return tvShowTitle;
41 }
42
43 public void setTvShowTitle(TextView tvShowTitle) {
44 this .tvShowTitle = tvShowTitle;
45 }
46
47 private ArrayList < ImageView > ivCollections;
48 private TextView tvShowTitle;
49 }
50
51 public CustomAdapter(Context context,
52 ArrayList < HashMap < String, String >> list, int resource,
53 String[] from, int [] to) {
54 this .list = list;
55 this .mInflater = LayoutInflater.from(context);
56 this .resource = resource;
57 this .from = from;
58 this .to = to;
59 this .hashMap = new HashMap < String, Object > ();
60 this .context = context;
61 }
62
63 @Override
64 public int getCount() {
65 // TODO Auto-generated method stub
66 return list.size();
67 }
68
69 @Override
70 public Object getItem( int position) {
71 // TODO Auto-generated method stub
72 return list.get(position);
73 }
74
75 @Override
76 public long getItemId( int position) {
77 // TODO Auto-generated method stub
78 return position;
79 }
80
81 @Override
82 public View getView( int position, View convertView, ViewGroup parent) {
83 // TODO Auto-generated method stub
84 if (convertView == null ) {
85 holder = new ViewHolder();
86 convertView = mInflater.inflate(resource, null );
87
88 ArrayList < ImageView > ivList = new ArrayList < ImageView > ();
89 ivList.add((ImageView) convertView.findViewById(R.id.ivLogo));
90 ivList.add((ImageView) convertView.findViewById(R.id.ivAlphaImg));
91 // 装载ImageView
92 holder.setIvCollections(ivList);
93 // 装载TextView
94 holder.setTvShowTitle((TextView) convertView.findViewById(to[ 0 ]));
95
96 convertView.setTag(holder);
97 } else {
98 holder = (ViewHolder) convertView.getTag();
99 }
100
101 // 获取单项数据
102 HashMap < String, String > hashMap = list.get(position);
103
104 holder.getIvCollections().get( 0 )
105 .setBackgroundResource(R.drawable.anim2);
106 holder.getIvCollections().get( 0 ).setOnTouchListener( this );
107
108 holder.getIvCollections().get( 1 ).getBackground().setAlpha( 200 );
109 holder.getTvShowTitle().setText(hashMap.get(from[ 0 ]));
110
111 return convertView;
112 }
113
114 @Override
115 public boolean onTouch(View v, MotionEvent event) {
116 // TODO Auto-generated method stub
117 switch (event.getAction()) {
118 case MotionEvent.ACTION_DOWN:
119 lastX = ( int ) event.getRawX();
120 lastY = ( int ) event.getRawY();
121
122 if (hashMap.isEmpty()) {
123 hashMap.put( " l " , v.getLeft());
124 hashMap.put( " t " , v.getTop());
125 hashMap.put( " r " , GetScreenWidth());
126 hashMap.put( " b " , v.getBottom());
127 }
128
129 // 获取遮罩层的位置
130 vLeft = Integer.parseInt(hashMap.get( " l " ).toString());
131 vTop = Integer.parseInt(hashMap.get( " t " ).toString());
132 vRight = Integer.parseInt(hashMap.get( " r " ).toString());
133 vBottom = Integer.parseInt(hashMap.get( " b " ).toString());
134
135 break ;
136 case MotionEvent.ACTION_MOVE:
137 int dx = ( int ) event.getRawX() - lastX;
138 int dy = ( int ) event.getRawY() - lastY;
139
140 int left = v.getLeft() + dx;
141 int top = v.getTop() + dy;
142 int right = v.getRight() + dx;
143 int bottom = v.getBottom() + dy;
144
145 if (left < vLeft) {
146 left = vLeft;
147 right = left + v.getWidth();
148 }
149
150 if (top < vTop) {
151 top = vTop;
152 bottom = top + v.getHeight();
153 }
154
155 if (right > vRight){
156 right = vRight;
157 left = right - v.getWidth();
158 }
159
160 if (bottom > vBottom) {
161 bottom = vBottom;
162 top = bottom - v.getHeight();
163 }
164
165 v.layout(left, top, right, bottom);
166
167 lastX = ( int ) event.getRawX();
168 lastY = ( int ) event.getRawY();
169
170 break ;
171 case MotionEvent.ACTION_UP:
172 break ;
173 }
174 return true ;
175 }
176
177 /**
178 * 获取屏幕宽度,将其作为图片拖拽到屏幕最右端时的终止坐标
179 * @return 屏幕宽度
180 */
181 private int GetScreenWidth(){
182 DisplayMetrics dm = context.getResources().getDisplayMetrics();
183 return dm.widthPixels;
184 }
185 }
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5
6 import android.content.Context;
7 import android.util.DisplayMetrics;
8 import android.view.LayoutInflater;
9 import android.view.MotionEvent;
10 import android.view.View;
11 import android.view.View.OnTouchListener;
12 import android.view.ViewGroup;
13 import android.widget.BaseAdapter;
14 import android.widget.ImageView;
15 import android.widget.TextView;
16
17 public class CustomAdapter extends BaseAdapter implements OnTouchListener {
18
19 private LayoutInflater mInflater;
20 private ViewHolder holder;
21 private ArrayList < HashMap < String, String >> list;
22 private int resource, lastX, lastY, vLeft, vTop,vRight, vBottom;
23 private HashMap < String, Object > hashMap;
24 private String[] from;
25 private int [] to;
26 private Context context;
27
28 // 自定义容器类
29 class ViewHolder {
30
31 public ArrayList < ImageView > getIvCollections() {
32 return ivCollections;
33 }
34
35 public void setIvCollections(ArrayList < ImageView > ivCollections) {
36 this .ivCollections = ivCollections;
37 }
38
39 public TextView getTvShowTitle() {
40 return tvShowTitle;
41 }
42
43 public void setTvShowTitle(TextView tvShowTitle) {
44 this .tvShowTitle = tvShowTitle;
45 }
46
47 private ArrayList < ImageView > ivCollections;
48 private TextView tvShowTitle;
49 }
50
51 public CustomAdapter(Context context,
52 ArrayList < HashMap < String, String >> list, int resource,
53 String[] from, int [] to) {
54 this .list = list;
55 this .mInflater = LayoutInflater.from(context);
56 this .resource = resource;
57 this .from = from;
58 this .to = to;
59 this .hashMap = new HashMap < String, Object > ();
60 this .context = context;
61 }
62
63 @Override
64 public int getCount() {
65 // TODO Auto-generated method stub
66 return list.size();
67 }
68
69 @Override
70 public Object getItem( int position) {
71 // TODO Auto-generated method stub
72 return list.get(position);
73 }
74
75 @Override
76 public long getItemId( int position) {
77 // TODO Auto-generated method stub
78 return position;
79 }
80
81 @Override
82 public View getView( int position, View convertView, ViewGroup parent) {
83 // TODO Auto-generated method stub
84 if (convertView == null ) {
85 holder = new ViewHolder();
86 convertView = mInflater.inflate(resource, null );
87
88 ArrayList < ImageView > ivList = new ArrayList < ImageView > ();
89 ivList.add((ImageView) convertView.findViewById(R.id.ivLogo));
90 ivList.add((ImageView) convertView.findViewById(R.id.ivAlphaImg));
91 // 装载ImageView
92 holder.setIvCollections(ivList);
93 // 装载TextView
94 holder.setTvShowTitle((TextView) convertView.findViewById(to[ 0 ]));
95
96 convertView.setTag(holder);
97 } else {
98 holder = (ViewHolder) convertView.getTag();
99 }
100
101 // 获取单项数据
102 HashMap < String, String > hashMap = list.get(position);
103
104 holder.getIvCollections().get( 0 )
105 .setBackgroundResource(R.drawable.anim2);
106 holder.getIvCollections().get( 0 ).setOnTouchListener( this );
107
108 holder.getIvCollections().get( 1 ).getBackground().setAlpha( 200 );
109 holder.getTvShowTitle().setText(hashMap.get(from[ 0 ]));
110
111 return convertView;
112 }
113
114 @Override
115 public boolean onTouch(View v, MotionEvent event) {
116 // TODO Auto-generated method stub
117 switch (event.getAction()) {
118 case MotionEvent.ACTION_DOWN:
119 lastX = ( int ) event.getRawX();
120 lastY = ( int ) event.getRawY();
121
122 if (hashMap.isEmpty()) {
123 hashMap.put( " l " , v.getLeft());
124 hashMap.put( " t " , v.getTop());
125 hashMap.put( " r " , GetScreenWidth());
126 hashMap.put( " b " , v.getBottom());
127 }
128
129 // 获取遮罩层的位置
130 vLeft = Integer.parseInt(hashMap.get( " l " ).toString());
131 vTop = Integer.parseInt(hashMap.get( " t " ).toString());
132 vRight = Integer.parseInt(hashMap.get( " r " ).toString());
133 vBottom = Integer.parseInt(hashMap.get( " b " ).toString());
134
135 break ;
136 case MotionEvent.ACTION_MOVE:
137 int dx = ( int ) event.getRawX() - lastX;
138 int dy = ( int ) event.getRawY() - lastY;
139
140 int left = v.getLeft() + dx;
141 int top = v.getTop() + dy;
142 int right = v.getRight() + dx;
143 int bottom = v.getBottom() + dy;
144
145 if (left < vLeft) {
146 left = vLeft;
147 right = left + v.getWidth();
148 }
149
150 if (top < vTop) {
151 top = vTop;
152 bottom = top + v.getHeight();
153 }
154
155 if (right > vRight){
156 right = vRight;
157 left = right - v.getWidth();
158 }
159
160 if (bottom > vBottom) {
161 bottom = vBottom;
162 top = bottom - v.getHeight();
163 }
164
165 v.layout(left, top, right, bottom);
166
167 lastX = ( int ) event.getRawX();
168 lastY = ( int ) event.getRawY();
169
170 break ;
171 case MotionEvent.ACTION_UP:
172 break ;
173 }
174 return true ;
175 }
176
177 /**
178 * 获取屏幕宽度,将其作为图片拖拽到屏幕最右端时的终止坐标
179 * @return 屏幕宽度
180 */
181 private int GetScreenWidth(){
182 DisplayMetrics dm = context.getResources().getDisplayMetrics();
183 return dm.widthPixels;
184 }
185 }
调用代码如下:
package
com.studio.basf.animationdemo;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private ArrayList < HashMap < String,String >> list;
private ListView lvDemo;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
list = new ArrayList < HashMap < String,String >> ();
lvDemo = (ListView)findViewById(R.id.lvDemo);
addDataTolvDemo();
}
private void addDataTolvDemo() {
HashMap < String,String > hashMap0 = new HashMap < String,String > ();
hashMap0.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap0);
HashMap < String,String > hashMap1 = new HashMap < String,String > ();
hashMap1.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap1);
HashMap < String,String > hashMap2 = new HashMap < String,String > ();
hashMap2.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap2);
HashMap < String,String > hashMap3 = new HashMap < String,String > ();
hashMap3.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap3);
HashMap < String,String > hashMap4 = new HashMap < String,String > ();
hashMap4.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap4);
CustomAdapter adapter = new CustomAdapter( this , list,
R.layout.main_item, new String[] { " title " },
new int [] { R.id.tvShowTitle });
lvDemo.setAdapter(adapter);
}
}
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private ArrayList < HashMap < String,String >> list;
private ListView lvDemo;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
list = new ArrayList < HashMap < String,String >> ();
lvDemo = (ListView)findViewById(R.id.lvDemo);
addDataTolvDemo();
}
private void addDataTolvDemo() {
HashMap < String,String > hashMap0 = new HashMap < String,String > ();
hashMap0.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap0);
HashMap < String,String > hashMap1 = new HashMap < String,String > ();
hashMap1.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap1);
HashMap < String,String > hashMap2 = new HashMap < String,String > ();
hashMap2.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap2);
HashMap < String,String > hashMap3 = new HashMap < String,String > ();
hashMap3.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap3);
HashMap < String,String > hashMap4 = new HashMap < String,String > ();
hashMap4.put( " title " , " 不要乱猜哦,我是标题哈~~ " );
list.add(hashMap4);
CustomAdapter adapter = new CustomAdapter( this , list,
R.layout.main_item, new String[] { " title " },
new int [] { R.id.tvShowTitle });
lvDemo.setAdapter(adapter);
}
}