xamarin C# 安卓实现 ListView 放大缩小
翻译自java示例https://raw.githubusercontent.com/Xjasz/AndroidZoomableViewGroup/master/ZoomListView.java
using Android.App;
using Android.Widget;
using Android.OS;
using Android.Views;
using System.Collections.Generic;
using Android.Net;
using Android.Graphics;
using System.Net;
using Android.Content;
using Android.Util;
using Java.Lang; namespace App1
{
[Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle); // Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main); var listView1 = FindViewById<ListView>(Resource.Id.listView1);
var rows = new List<RowItem>();
rows.Add(new RowItem { URL = "http://192.168.0.50:8001/OMS/tempimage/c152fd1f-ef44-42a6-96fb-3b4894ab8004636499813730162442.gif" });
rows.Add(new RowItem { URL = "http://192.168.0.50:8001/OMS/tempimage/9e8a1d81-7211-4c1f-bc5c-b7193c12a92c636499813730162442.gif" });
rows.Add(new RowItem { URL = "http://192.168.0.50:8001/OMS/tempimage/6f0eca83-7b5e-4e9e-999c-3ef88e277117636499813730162442.gif" });
listView1.Adapter = new ListViewRowAdapter(this, rows);
}
} public class MyListView : ListView
{
private MyListViewParameter ParameterInfo = new MyListViewParameter();
private ScaleGestureDetector ScaleDetector { get; set; } public MyListView(Context context)
:base(context)
{
this.ScaleDetector = new ScaleGestureDetector(context, new ScaleListener(ParameterInfo, this));
}
public MyListView(Context context, IAttributeSet attrs)
:base(context,attrs)
{
this.ScaleDetector = new ScaleGestureDetector(context, new ScaleListener(ParameterInfo, this));
}
public MyListView(Context context, IAttributeSet attrs, int defStyleAttr)
:base(context,attrs,defStyleAttr)
{
this.ScaleDetector = new ScaleGestureDetector(context, new ScaleListener(ParameterInfo, this));
}
public MyListView(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes)
:base(context,attrs,defStyleAttr,defStyleRes)
{
this.ScaleDetector = new ScaleGestureDetector(context, new ScaleListener(ParameterInfo, this));
} protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
this.ParameterInfo.Width = MeasureSpec.GetSize(widthMeasureSpec);
this.ParameterInfo.Height = MeasureSpec.GetSize(heightMeasureSpec);
base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
} public override bool OnTouchEvent(MotionEvent ev)
{
var result = base.OnTouchEvent(ev);
var action = ev.Action;
this.ScaleDetector.OnTouchEvent(ev);
switch (action)
{
case MotionEventActions.Down:
{
float x = ev.GetX();
float y = ev.GetY(); this.ParameterInfo.LastTouchX = x;
this.ParameterInfo.LastTouchY = y; this.ParameterInfo.ActivePointerId = ev.GetPointerId();
break;
} case MotionEventActions.Move:
{
int pointerIndex = ev.FindPointerIndex(this.ParameterInfo.ActivePointerId);
float x = ev.GetX(pointerIndex);
float y = ev.GetY(pointerIndex);
float dx = x - this.ParameterInfo.LastTouchX;
float dy = y - this.ParameterInfo.LastTouchY; this.ParameterInfo.PosX += dx;
this.ParameterInfo.PosY += dy; if (this.ParameterInfo.PosX > 0.0f)
this.ParameterInfo.PosX = 0.0f;
else if (this.ParameterInfo.PosX < this.ParameterInfo.MaxWidth)
this.ParameterInfo.PosX = this.ParameterInfo.MaxWidth; if (this.ParameterInfo.PosY > 0.0f)
this.ParameterInfo.PosY = 0.0f;
else if (this.ParameterInfo.PosY < this.ParameterInfo.MaxHeight)
this.ParameterInfo.PosY = this.ParameterInfo.MaxHeight; this.ParameterInfo.LastTouchX = x;
this.ParameterInfo.LastTouchY = y; this.Invalidate();
break;
} case MotionEventActions.Up:
{
this.ParameterInfo.ActivePointerId = this.ParameterInfo.INVALID_POINTER_ID;
break;
} case MotionEventActions.Cancel:
{
this.ParameterInfo.ActivePointerId = this.ParameterInfo.INVALID_POINTER_ID;
break;
} case MotionEventActions.PointerUp:
{
int pointerIndex = ((int)action & (int)MotionEventActions.PointerIndexMask) >> (int)MotionEventActions.PointerIndexShift;
int pointerId = ev.GetPointerId(pointerIndex);
if (pointerId == this.ParameterInfo.ActivePointerId)
{
int newPointerIndex = pointerIndex == ? : ;
this.ParameterInfo.LastTouchX = ev.GetX(newPointerIndex);
this.ParameterInfo.LastTouchY = ev.GetY(newPointerIndex);
this.ParameterInfo.ActivePointerId = ev.GetPointerId(newPointerIndex);
}
break;
}
} return true;
} protected override void OnDraw(Canvas canvas)
{
base.OnDraw(canvas);
canvas.Save(SaveFlags.Matrix);
canvas.Translate(this.ParameterInfo.PosX, this.ParameterInfo.PosY);
canvas.Scale(this.ParameterInfo.ScaleFactor, this.ParameterInfo.ScaleFactor);
canvas.Restore(); } protected override void DispatchDraw(Canvas canvas)
{
canvas.Save(SaveFlags.Matrix);
if (this.ParameterInfo.ScaleFactor == 1.0f)
{
this.ParameterInfo.PosX = 0.0f;
this.ParameterInfo.PosY = 0.0f;
}
canvas.Translate(this.ParameterInfo.PosX, this.ParameterInfo.PosY);
canvas.Scale(this.ParameterInfo.ScaleFactor, this.ParameterInfo.ScaleFactor);
base.DispatchDraw(canvas);
canvas.Restore();
this.Invalidate();
} public class MyListViewParameter
{
public MyListViewParameter()
{
this.INVALID_POINTER_ID = -;
this.ActivePointerId = -;
this.ScaleFactor = 1.0f;
this.MaxWidth = 0.0f;
this.MaxHeight = 0.0f;
} public int INVALID_POINTER_ID { get; private set; }
public int ActivePointerId { get; set; }
public float ScaleFactor { get; set; }
public float MaxWidth { get; set; }
public float MaxHeight { get; set; }
public float LastTouchX { get; set; }
public float LastTouchY { get; set; }
public float PosX { get; set; }
public float PosY { get; set; }
public float Width { get; set; }
public float Height { get; set; }
} private class ScaleListener : ScaleGestureDetector.SimpleOnScaleGestureListener
{
private MyListViewParameter ParameterInfo { get; set; }
private ListView MyListView { get; set; } public ScaleListener(MyListViewParameter pi,ListView lv)
{
this.ParameterInfo = pi;
this.MyListView = lv;
} public override bool OnScale(ScaleGestureDetector detector)
{
this.ParameterInfo.ScaleFactor *= detector.ScaleFactor;
this.ParameterInfo.ScaleFactor = Math.Max(1.0f, Math.Min(this.ParameterInfo.ScaleFactor, 3.0f));
this.ParameterInfo.MaxWidth = this.ParameterInfo.Width - (this.ParameterInfo.Width * this.ParameterInfo.ScaleFactor);
this.ParameterInfo.MaxHeight = this.ParameterInfo.Height - (this.ParameterInfo.Height * this.ParameterInfo.ScaleFactor);
this.MyListView.Invalidate();
return true;
}
}
} public class RowItem
{
public string URL { get; set; }
} public class ListViewRowAdapter : BaseAdapter<RowItem>
{
List<RowItem> items;
Activity context;
public ListViewRowAdapter(Activity context, List<RowItem> items)
: base()
{
this.context = context;
this.items = items;
}
public override long GetItemId(int position)
{
return position;
}
public override RowItem this[int position]
{
get { return items[position]; }
}
public override int Count
{
get { return items.Count; }
} /// <summary>
/// 下载图片
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private Bitmap GetImageBitmapFromUrl(string url)
{
Bitmap imageBitmap = null; using (var webClient = new WebClient())
{
var imageBytes = webClient.DownloadData(url);
if (imageBytes != null && imageBytes.Length > )
{
imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, , imageBytes.Length);
}
} return imageBitmap;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var item = items[position];
View view = convertView;
if (view == null) // no view to re-use, create new
view = context.LayoutInflater.Inflate(Resource.Layout.ListViewRow, null);
var url = Uri.Parse(item.URL);
view.FindViewById<ImageView>(Resource.Id.Image1).SetImageBitmap(GetImageBitmapFromUrl(item.URL));
return view;
}
}
}
xamarin C# 安卓实现 ListView 放大缩小的更多相关文章
- PhotoView实现图片随手势的放大缩小的效果
项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...
- 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
首先呢,还是一贯作风,我们先来看看众多应用中的示例:(这种效果是很常见的,可以说应用的必须品.) 搜狐客户端 ...
- 猫猫学IOS(二)UI之button操作 点击变换 移动 放大缩小 旋转
不多说,先上图片看效果,猫猫分享.必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:viewmode=contents">http://blog.csdn.net/u013 ...
- AJ学IOS(02)UI之按钮操作 点击变换 移动 放大缩小 旋转
不多说,先上图片看效果,AJ分享,必须精品 这个小程序主要实现点击方向键可以让图标上下左右动还有放大缩小以及旋转的功能,点击图片会显示另一张图片. 点击变换 其实用到了按钮的两个状态,再State C ...
- 【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)
这是一个iOS项目雅黑深邃的K线的绘制. 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://git ...
- 鼠标上下滑动总是放大缩小页面,按住ctrl+0
鼠标上下滑动总是放大缩小页面,可能是ctrl键失灵了,幸好键盘有两个ctrl键,按住ctrl+0,页面就正常了,吓死宝宝了,~~~~(>_<)~~~~
- WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用
一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- Android 本地/网路下载图片实现放大缩小
Android 本地加载/网路下载图片实现放大缩小拖拉效果,自定义控件. package com.example.ImageViewCustom; import android.app.Activi ...
随机推荐
- 剧透 & 报名 | 蚂蚁金服ATEC城市峰会·上海即将开幕
小蚂蚁说: 2019年1月4日,蚂蚁金服ATEC城市峰会将以“数字金融新原力(The New Force of Digital Finance)”为主题,在中国上海举办.蚂蚁金服ATEC(Ant Te ...
- kod 编辑器下载
链接: https://pan.baidu.com/s/1ZACwJZ_x2ZBziqPlm17z6w 提取码: 3w9m
- Nginx 配置负载均衡
nginx负载均衡配置,主要是proxy_pass,upstream的使用. 注意问题,多台机器间session的共享问题. 不用session,用户cookie.或者用redis替代session. ...
- python @的用法
来自:https://www.cnblogs.com/jmlovepython/p/7427297.html @相当于在一个函数中调用另一个函数,并执行操作 def funA(x): print(x( ...
- pagex/y offsetx/y screenx/y clientx/y 用法及区别
1 pagex/pagey:鼠标相对于整个页面的x/y坐标 注:整个页面的意思就是你整个页面的全部 例如:宽200px 高400px 那么pagex/y他们最大值就是它 2,offsetX/y与pa ...
- 更改npm淘宝源,并设置cnpm
一.通过命令配置1. 命令 npm config set registry https://registry.npm.taobao.org2. 验证命令 npm config get registry ...
- Ubuntu 停止 mydesktop 服务
systemctl list-unit-files | grep mydesktop systemctl disable mydesktop.service
- Android之Fragment(碎片)方方面面
Fragment简介碎片(Fragment)是一种可以嵌入到活动当中的UI片段,它能让程序更加合理和充分的利用大屏幕的空间. Fragment的生命周期 它与Activity生命周期的关系: 可以看到 ...
- Java中如何设置表格处于不可编辑状态
代码片段如下: 这样的话就可以将表格设置为不可编辑状态
- regex-ways
regex的分组与捕获:分组就是用小括号(str)括起来的东西,就是一个分组.要想得到这些分组的信息,就要想办法捕获.每个分组都有编号,编号规则是从外向内,从左至右. .例如,在表达式 (A)(B(C ...