- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
可以在 Xamarin/Android 中在运行时创建一个 9 补丁吗?
这与 this question 相同或 this question ,但在 Xamarin 下工作。对那里给出的答案进行天真的翻译会产生扭曲的 9-patch 。
在下图中,原始图像在左上角——下面的代码正确地没有对它做任何事情。其余的应该是 9 补丁。似乎正在发生的事情是左上角被拉伸(stretch),而不是它应该的中心。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Graphics;
using Android.Graphics.Drawables;
using Java.IO;
using Android.Content.Res;
using System.IO;
using System.Drawing;
namespace Android9PatchFail
{
public class ImageCanvas : View
{
public ImageCanvas (Context context) :
base(context)
{
Initialize();
}
public ImageCanvas (Context context, IAttributeSet attrs) :
base(context, attrs)
{
Initialize();
}
public ImageCanvas (Context context, IAttributeSet attrs, int defStyle) :
base(context, attrs, defStyle)
{
Initialize();
}
void Initialize () {
this.SetBackgroundColor(Android.Graphics.Color.White);
}
public Bitmap ImageBitmap {
get {
AssetManager manager = this.Resources.Assets;
Stream stream = manager.Open("buttonb.png");
Bitmap r = BitmapFactory.DecodeStream(stream);
return r;
}
}
protected override void OnDraw (Canvas canvas) {
base.OnDraw(canvas);
Bitmap bitmap = this.ImageBitmap;
Paint paint = new Paint();
// canvas.DrawBitmap(bitmap, 20, 20, paint);
float bitmapWidth = bitmap.Width;
float bitmapHeight = bitmap.Height;
// this.DrawScaledImage(canvas, bitmap, 20, 50, new Size(100, 100));
Random rand = new Random();
double growthFactor = 0.5; rand.NextDouble();
int top = 4; // 4 12 18 14 did give output with growth of 0.174.
int left = 12;
int bottom = 18;
int right = 14;
System.Diagnostics.Debug.WriteLine("Growth is " + growthFactor);
System.Diagnostics.Debug.WriteLine("Insets are " + top + " " + left + " " + bottom + " " + right);
for (int i = 0; i < 9; i++) {
int row = i / 3;
int column = i % 3;
int width = (int) ((1 + column*growthFactor) * bitmapWidth);
float x = 20;
switch (column) {
case 1: x = 200; break;
case 2: x = 450; break;
default: break;
}
float y = 40 + 160 * row;
int height = (int) ((1 + row*growthFactor) * bitmapHeight);
Size size = new Size(width, height);
// this.DrawScaledImage(canvas, bitmap, x, y, size);
this.DrawNinePatchBitmap(canvas, bitmap, x, y, top, left, bottom, right, size);
// this.DrawNinePatchBitmap(canvas, bitmap, 200, 100, 1, 1, 5, 5, new SizeF(2 * bitmapWidth, 2 * bitmapHeight));
}
}
public void DrawScaledImage (Canvas canvas, Bitmap bitmapToStretch, float x, float y, Size requestedSize) {
Android.Graphics.Bitmap b = Android.Graphics.Bitmap.CreateScaledBitmap(bitmapToStretch, requestedSize.Width, requestedSize.Height, false);
canvas.DrawBitmap(b, x, y, null);
}
public void DrawNinePatchBitmap (Canvas canvas, Android.Graphics.Bitmap bitmapToStretch, float x, float y, int top, int left, int right, int bottom, SizeF requestedSize)
{
RectF rect = new RectF(x, y, x+requestedSize.Width, y+requestedSize.Height);
// System.Diagnostics.Debug.WriteLine("Rect is " + x + " " + y + " " + requestedSize.Width + " " + requestedSize.Height);
NinePatch npBitmap = CreateNinePatch(bitmapToStretch, top, left, bottom, right);
npBitmap.Draw(canvas, rect);
}
private NinePatch CreateNinePatch(Android.Graphics.Bitmap bitmap, int top, int left, int bottom, int right) {
MemoryStream buffer = GetMemoryStream(top, left, bottom, right);
NinePatch patch = new NinePatch(bitmap, buffer.ToArray(), "blah");
return patch;
}
private MemoryStream GetMemoryStream(int top, int left, int bottom, int right) {
//Docs check the NinePatchChunkFile
MemoryStream buffer = new MemoryStream(new byte[84]);
using (BinaryWriter writer = new BinaryWriter(buffer)) {
//was translated
writer.Write(new byte[] { 0x01 });
//divx size
writer.Write(new byte[] { 0x02 });
//divy size
writer.Write(new byte[] { 0x02 });
//color size
writer.Write(new byte[] { 0x09 });
//skip
writer.Write(0);
writer.Write(0);
//padding
writer.Write(0);
writer.Write(0);
writer.Write(0);
writer.Write(0);
//writer.Write(left);
//writer.Write(right);
//writer.Write(top);
//writer.Write(bottom);
//skip 4 bytes
writer.Write(0);
//offsets
writer.Write(left);
writer.Write(right);
writer.Write(top);
writer.Write(bottom);
//No color
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
writer.Write(0x00000001);
}
return buffer;
}
}
}
最佳答案
XobotOS是 Android 4.0 源代码的半自动端口,来自Java 到 C#
。使用改进版本移植了自动化部件可以编译更高级的 Java 结构和支持的 Sharpen泛型。
关于Xamarin 下的 Android runtime 9-patch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799247/
我在内存中有一个 Map 来存储我的对象。我想在内存不足时刷新内存。我现在正在这样做: void add(K key, V value) { if (underPressure()) {
我是 JBPM 的新手。我下载并开始使用 eclipse。然后我安装了 JBPM 插件和 Modeler 2.0 插件。当我创建一个新的 JBPM 项目时,它要求 JBPM 运行时。我在互联网上搜索了
我是 JBPM 的新手。我下载并开始使用 eclipse。然后我安装了 JBPM 插件和 Modeler 2.0 插件。当我创建一个新的 JBPM 项目时,它要求 JBPM 运行时。我在互联网上搜索了
我目前正在将Windows 8.1应用程序移植到Windows 10 UAP应用程序,该应用程序使用互操作在C++和C#之间进行通信,并且 pop 以下错误: $(ProjectName).Inter
我正在使用 Parcel 来捆绑我的项目并 Jest 运行我的测试。 一切正常,但在测试中我有 async/await关键字,我必须导入 regenerator-runtime/runtime像这样:
一旦我尝试使用 Promises,Browserify 就会抛出此错误。 在 中找不到模块“regenerator-runtime/runtime” 我尝试过 Node 版本 10.15.3 和 12
我目前正在试验 quarkus,找不到在运行时更改一些 openapi 信息的方法(这里,我希望授权 url 根据环境而改变)。 应该可以通过使用 OASFilter 并从环境变量中提供信息来实现,但
我正在使用 rust_bert 汇总文本。我需要使用rust_bert::pipelines::summarization::SummarizationModel::new设置模型,该模型可以从互联网
我正在 Visual Studio 中处理其中一个新的“类库(NuGet 包)”项目。一切都很顺利,直到前几天它开始引发有关 System.Runtime.Extensions 程序集的错误: Ass
我正在使用 tokio::runtime::current_thread::Runtime我希望能够在同一个线程中运行 future 并停止 react 堆。页面上的示例未显示如何停止运行时。有什么办
我找不到如何声明 runtime.LockOSThread()和 runtime.UnlockOSThread() .我将其定义为 [runtime.LockOSThread()] 一些代码 [run
我有这样的代码, Routine 1 { runtime.LockOSThread() print something send int to routine 2 runtime.UnlockOSTh
我正在尝试执行此操作:当我单击“搜索”按钮时,命令提示符窗口打开。 我尝试使用ProcessBuilder,没有出现错误,但是不起作用。你能帮我一下吗? package sys.tool; impor
我的应用程序运行大约 4 小时后出现此错误。我不知道为什么会这样。该错误发生在 windows 7 和 windows XP 系统上。抱歉,我没有更多信息。我的应用程序运行大约 4 次后才收到此错误消
我收到错误:“此程序集是由比当前加载的运行时更新的运行时构建的,无法加载。” 我有一个 .NET 2.0 项目调用的 .NET 4.0 dll 项目。有没有办法调和框架的差异? 最佳答案 I have
我有一个 WIX 安装程序,它在安装过程中执行自定义操作。当我运行 WIX 安装程序并遇到它的第一个自定义操作时,安装程序失败,我在 MSI 日志中收到如下错误: Action start 12:
我正在尝试提交 spark 作业 它是这样开始的: import javax.xml.parsers.{SAXParser, SAXParserFactory} import org.apache.s
我正在做一些 WCF 工作,但我不明白为什么会遇到这个错误。 System.Runtime.Serialization.DataContractAttribute命名空间中不存在 System.Run
我尝试按照 this 在 React 应用程序中使用 async/await : 目前,我正在运行webpack --config webpack.dev.config.js --watch --pr
我已经从托管的 Window Server 2008 下载了已发布的(代码隐藏文件不存在,与 bin 文件夹中的 dll 结合)Web 应用程序,并在调试该应用程序时使用 Visual Studio
我是一名优秀的程序员,十分优秀!