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 ...
随机推荐
- 关系数据库、NoSQL和NewSQL数据库产品分类
- sony Z5P 刷rec、root的方法
想root需要刷第三方recovery,刷recovery需要先解锁.但如果直接解锁,会丧失相机算法.屏幕超逼真模式,所以不能直接来. 大体步骤就是解完锁后自己做个内核刷进去,欺骗系统让他觉得没解锁. ...
- P2292 [HNOI2004]L语言
传送门 思路: 毒瘤的字典树! ▲主要分有两个步骤: ① 日常的建树. ② 暴力地求解. ▲日常建树:过于基础,跳过. ▲重点在于如何暴力地求解而不被卡掉(DP?不存在的) 可以利用区间动规的思想, ...
- [Android - Recovery] 如何刷入第三方recovery
https://www.xda-developers.com/how-to-install-twrp/ 方便复制 adb reboot bootloader fastboot flash recove ...
- LeetCode--021--合并两个有序链表(java)
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2- ...
- 『TensorFlow』降噪自编码器设计
背景简介 TensorFlow实现讲解 设计新思路: 1.使用类来记录整个网络: 使用_init_()属性来记录 网络超参数 & 网络框架 & 训练过程 使用一个隐式方法初始化网络参数 ...
- linux安装elasticsearch-head和elasticsearch-analysis-ik及遇到的各种问题
1.获取elasticsearch-head http://mobz.github.io/elasticsearch-head/ 下载并解压 wget https://github.com/mobz/ ...
- a*b高精度数组算法
#include<stdio.h> #include<string.h> int main() { ]={},b[]={},c[]={},len1=,len2=; ],str2 ...
- 朋友给的IE滚动条
scrollbar-arrow-color: #f4ae21; /*图6,三角箭头的颜色*/scrollbar-face-color: #333; /*图5,立体滚动条的颜色*/scrollbar ...
- 如何把已有SQLSERVER数据库更名而且附加到数据库中?
如何把已有SQLSERVER数据库更名而且附加到数据库中? 例如:已有数据库:zrmaa,希望更名为jjsh 特别提醒:数据库名中不能加入下划线,因为数据库日志文件有下划线. 把数据库文件mdf和数据 ...