效果图;
下拉前
下拉之后
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.xaozu.count.app.view.ImgListView
android:id="@+id/xListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:dividerHeight="0dp"
android:divider="#ffffff"
android:fadingEdgeLength="0dp"
android:padding="0dp"
android:layout_margin="0dp"
/>
</RelativeLayout>
activity文件
public class ImagList extends Activity {
public static ImageView imageView;
public static int displayWidth;
private Bitmap bmp;
/** 用于记录拖拉图片移动的坐标位置 */
public static Matrix matrix = new Matrix();
/** 用于记录图片要进行拖拉时候的坐标位置 */
public static Matrix currentMatrix = new Matrix();
public static Matrix defaultMatrix = new Matrix();
public static float imgHeight,imgWidth;
/** 记录是拖拉照片模式还是放大缩小照片模式 */
public static int mode = 0;// 初始状态
/** 拖拉照片模式 */
public static final int MODE_DRAG = 1;
/** 用于记录开始时候的坐标位置 */
public static PointF startPoint = new PointF();
private ImgListView sListView;
private List<News> sNewsList;
private NewsAdapter sNewsAdapter;
private Context sContext;
private View headerView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
//取得屏幕分辨率大小
DisplayMetrics dm=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
displayWidth=dm.widthPixels;
sContext = ImagList.this;
sNewsList = new ArrayList<News>();
geneItems();
sListView = (ImgListView) findViewById(R.id.xListView);
// sListView.setPullLoadEnable(true);
bmp= BitmapFactory.decodeResource(getResources(), R.drawable.top_img);
headerView=getLayoutInflater().inflate(R.layout.top_img, null);
imageView = (ImageView) headerView.findViewById(R.id.imageView);
initView();
sListView.addHeaderView(headerView);
sNewsAdapter = new NewsAdapter();
sListView.setAdapter(sNewsAdapter);
// sListView.setOnTouchListener(new TouchListener());
}
/**
* 初始化图片
*/
private void initView(){
float scale = (float)displayWidth/(float)bmp.getWidth();//1080/1800
matrix.postScale(scale, scale,0,0);
imageView.setImageMatrix(matrix);
defaultMatrix.set(imageView.getImageMatrix());
imgHeight=scale*bmp.getHeight();
imgWidth=scale*bmp.getWidth();
ListView.LayoutParams relativeLayout=new ListView.LayoutParams((int)imgWidth,(int)imgHeight);
imageView.setLayoutParams(relativeLayout);
}
protected void onDestroy() {
super.onDestroy();
bmp.recycle();
matrix=new Matrix();
}
private class NewsAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public NewsAdapter() {
mInflater = LayoutInflater.from(sContext);
}
@Override
public int getCount() {
return sNewsList.size();
}
@Override
public Object getItem(int position) {
return sNewsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder h = null;
if (convertView == null) {
h = new Holder();
convertView = mInflater.inflate(R.layout.list_item,
null);
h.tv = (TextView) convertView.findViewById(R.id.tv_time);
h.iv = (TextView) convertView.findViewById(R.id.iv_icon);
h.content = (TextView) convertView.findViewById(R.id.tv_content);
convertView.setTag(h);
} else {
h = (Holder) convertView.getTag();
}
News news = sNewsList.get(position);
int time = news.getTime();
int icon = news.getIcon();
int img = news.getPic();
h.tv.setText(sContext.getString(time));
// h.iv.setText(position+"");
// h.content.setBackgroundResource(img);
return convertView;
}
private class Holder {
public TextView tv;
public TextView iv;
public TextView content;
}
}
private void geneItems() {
for (int i = 0; i != 5; ++i) {
//items.add("refresh cnt " + (++start));
// ++start;
News news = new News();
news.setTime(R.string.str_time);
news.setIcon(R.drawable.psd);
// news.setPic(R.drawable.hn_sms_in_bg);
sNewsList.add(news);
}
}
listview文件
public class ImgListView extends ListView {
public ImgListView(Context context) {
super(context);
}
public ImgListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ImgListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
}
public void addHeaderView(View v) {
super.addHeaderView(v);
}
/**
* 向下滑动让图片变大
* @param event
* @return
*/
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
// 手指压下屏幕
case MotionEvent.ACTION_DOWN:
ImagList.mode = ImagList.MODE_DRAG;
// 记录ImageView当前的移动位置
ImagList.currentMatrix.set(ImagList.imageView.getImageMatrix());
ImagList.startPoint.set(event.getX(), event.getY());
break;
// 手指在屏幕上移动,改事件会被不断触发
case MotionEvent.ACTION_MOVE:
// 拖拉图片
if (ImagList.mode == ImagList.MODE_DRAG) {
float dx = event.getX() - ImagList.startPoint.x; // 得到x轴的移动距离
float dy = event.getY() - ImagList.startPoint.y; // 得到x轴的移动距离
// 在没有移动之前的位置上进行移动
ImagList.matrix.set(ImagList.currentMatrix);
float scale = (dy+ImagList.imgHeight) / ImagList.imgHeight;// 得到缩放倍数
if(dy>0){
ListView.LayoutParams relativeLayout=new ListView.LayoutParams((int)(scale*ImagList.imgWidth),(int)(scale*ImagList.imgHeight));
ImagList.imageView.setLayoutParams(relativeLayout);
ImagList.matrix.postScale(scale, scale,ImagList.imgWidth/2,0);
}
}
break;
// 手指离开屏幕
case MotionEvent.ACTION_UP:
// 当触点离开屏幕,图片还原
ListView.LayoutParams relativeLayout=new ListView.LayoutParams((int)ImagList.imgWidth,(int)ImagList.imgHeight);
ImagList.imageView.setLayoutParams(relativeLayout);
ImagList.matrix.set(ImagList.defaultMatrix);
case MotionEvent.ACTION_POINTER_UP:
ImagList.mode = 0;
break;
}
ImagList.imageView.setImageMatrix(ImagList.matrix);
return super.onTouchEvent(event);
}
}
偷懒用了 public static
源码地址:
http://pan.baidu.com/s/1ntocyrZ