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 ...
随机推荐
- collection.Counter
a=['A','B','C','A','D','E','W','A','B'] b=collections.Counter(a) # 可以统计a中的各个元素出现的次数print(b)print(b[ ...
- OPENAPI规范Swagger
OPENAPI规范 是一种规范,Swagger是一种工具,Swagger帮我们使用OPENAPI更具体更完善,更好. 博客1:https://app.swaggerhub.com/help/index ...
- android ncnn
1.下载解压ndk wget https://dl.google.com/android/repository/android-ndk-r17b-linux-x86_64.zip unzip andr ...
- prometheus告警配置注意事项
global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minut ...
- regex-ways
regex的分组与捕获:分组就是用小括号(str)括起来的东西,就是一个分组.要想得到这些分组的信息,就要想办法捕获.每个分组都有编号,编号规则是从外向内,从左至右. .例如,在表达式 (A)(B(C ...
- python中模块包的离线下载教程
1.简介 当我们进行Python项目的迁移时(例如迁移到另外一台服务器上),如果该服务器要求离线安装, 往往需要我们将项目中的所需模块包进行离线操作. 2.教程 2.1 首先安装pip2pi模块,它可 ...
- Wireshark 过滤 基本语法
转载 1.过滤IP,如来源IP或者目标IP等于某个IP 例子: ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107 或者 ip.addr eq 1 ...
- Weka中数据挖掘与机器学习系列之Weka系统安装(四)
能来看我这篇博客的朋友,想必大家都知道,Weka采用Java编写的,因此,具有Java“一次编译,到处运行”的特性.支持的操作系统有Windows x86.Windows x64.Mac OS X.L ...
- Selenium+Eclipse+Python 环境搭建
第一步:安装Python 根据下面的地址,直接一键安装,全部默认方式. 下载地址:http://www.python.org/ftp/python/2.7.5/python-2.7.5.msi 安装到 ...
- void的几点用法
1.可以通过void 0 获取undefined.等同于void(0). void 任意数 === undefined // true void(0) === undefined // true ...