将自定义视图添加到在 PDFTron.Android for Xamarin 中不起作用的页面
Adding a custom view to a page not working in PDFTron.Android for Xamarin
我正在尝试将 PDFTron 用于 Xamarin Android。
我想渲染和绘制我的自定义注释,而不使用他们的注释系统。
根据他们在 https://www.pdftron.com/documentation/xamarin/guides/ui-customization/custom-view/android/ 中的文档,您可以添加一个不起作用的 CustomRelativeLayout。
它基本上不会在 PDF 顶部呈现任何内容
我在此处托管了整个解决方案 http://s000.tinyupload.com/index.php?file_id=14574507524295393508,因此很容易测试并查看是否有人可以看出问题所在。
谢谢!
更新
尝试了 Shirley G 的建议。将pdf_custom_layout修改为:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Custom Layout Text View"
android:textSize="24dp"
android:elevation="2dp"/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_dark" />
</LinearLayout>
代码为:
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
private PDFViewCtrl _pdfControl;
private PDFDoc _doc;
protected override void OnCreate(Bundle savedInstanceState)
{
PDFNet.Initialize(this, Resource.Raw.pdfnet, "Insert commercial license key here after purchase");
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
_pdfControl = FindViewById<PDFViewCtrl>(Resource.Id.pdfControl);
var assets = this.Assets;
using var sr = new StreamReader(assets.Open("dummy.pdf"));
_doc = new PDFDoc(sr.BaseStream);
_pdfControl.DocumentLoad += _pdfControl_DocumentLoad;
_pdfControl.SetDoc(_doc);
}
private void _pdfControl_DocumentLoad(object sender, System.EventArgs e)
{
var overlay = new CustomRelativeLayout(BaseContext);
var color = new Android.Graphics.Color(BaseContext.GetColor(Resource.Color.red));
overlay.SetBackgroundColor(color);
overlay.SetZoomWithParent(true);
LayoutInflater.Inflate(Resource.Layout.pdf_custom_layout, overlay);
_pdfControl.AddView(overlay);
}
但是什么也没发生,仍然没有显示叠加。
更新 2
我添加了修复程序并开始工作,但是,当我添加此代码时:
var overlay = new CustomRelativeLayout(BaseContext, _pdfControl, 50, 50, 1);
overlay.SetBackgroundColor(BaseContext.Resources.GetColor(Resource.Color.orange));
overlay.SetZoomWithParent(true);
_pdfControl.AddView(overlay);
overlay.LayoutParameters.Width = 300;
overlay.LayoutParameters.Height = 300;
_pdfControl.Invalidate();
overlay.RequestLayout();
我在页面位置 x=50 和 y50 处看到一个 50x50 的小矩形。我指定叠加层的宽度为 300,但它没有显示。
如果我添加这个,什么也不会显示,即使在 x=0,y =0 处的叠加层应该是 300x300。
var overlay = new CustomRelativeLayout(BaseContext, _pdfControl, 0, 0, 1);
需要将布局添加到视图层次结构(即 PDFViewCtrl.AddView),这在您的项目中没有完成。您可以在此处找到工作示例:
https://github.com/PDFTron/pdftron-android-samples/tree/master/CustomUI
具体来说,相关代码可以在这里找到:
https://github.com/PDFTron/pdftron-android-samples/blob/master/CustomUI/app/src/main/java/com/pdftron/android/tutorial/customui/custom/CustomLinkClick.java
示例将布局添加到第 3 页,因为您的 pdf 文件只有 1 页,您需要在 XML 布局中将其更改为第 1 页。请注意,所有 posX 和 poxY 都在页面 space 中,而不是屏幕 space。在此处阅读有关该主题的更多信息:
https://www.pdftron.com/documentation/android/guides/basics/coordinates
考虑到这一点,运行您的项目将看到:
布局:
<pdftron.PDF.Tools.CustomRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp"
app:posX="50"
app:posY="50"
app:pageNum="1"
app:zoomWithParent="true">
<!--Child views under CustomRelativeLayout-->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Custom Layout Text View"
android:textSize="12sp"
android:elevation="2dp"/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_dark" />
</pdftron.PDF.Tools.CustomRelativeLayout>
如果以编程方式添加视图,则需要指定位置,或者如果将其放在注释上,则可以指定注释。
通常看起来像这样:
CustomRelativeLayout overlay = new CustomRelativeLayout(context);
overlay.setBackgroundColor(context.getResources().getColor(R.color.orange));
overlay.setAnnot(pdfViewCtrl, annot, pageNum);
overlay.setZoomWithParent(true);
pdfViewCtrl.addView(overlay);
我正在尝试将 PDFTron 用于 Xamarin Android。 我想渲染和绘制我的自定义注释,而不使用他们的注释系统。 根据他们在 https://www.pdftron.com/documentation/xamarin/guides/ui-customization/custom-view/android/ 中的文档,您可以添加一个不起作用的 CustomRelativeLayout。 它基本上不会在 PDF 顶部呈现任何内容
我在此处托管了整个解决方案 http://s000.tinyupload.com/index.php?file_id=14574507524295393508,因此很容易测试并查看是否有人可以看出问题所在。
谢谢!
更新
尝试了 Shirley G 的建议。将pdf_custom_layout修改为:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Custom Layout Text View"
android:textSize="24dp"
android:elevation="2dp"/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_dark" />
</LinearLayout>
代码为:
[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
private PDFViewCtrl _pdfControl;
private PDFDoc _doc;
protected override void OnCreate(Bundle savedInstanceState)
{
PDFNet.Initialize(this, Resource.Raw.pdfnet, "Insert commercial license key here after purchase");
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
_pdfControl = FindViewById<PDFViewCtrl>(Resource.Id.pdfControl);
var assets = this.Assets;
using var sr = new StreamReader(assets.Open("dummy.pdf"));
_doc = new PDFDoc(sr.BaseStream);
_pdfControl.DocumentLoad += _pdfControl_DocumentLoad;
_pdfControl.SetDoc(_doc);
}
private void _pdfControl_DocumentLoad(object sender, System.EventArgs e)
{
var overlay = new CustomRelativeLayout(BaseContext);
var color = new Android.Graphics.Color(BaseContext.GetColor(Resource.Color.red));
overlay.SetBackgroundColor(color);
overlay.SetZoomWithParent(true);
LayoutInflater.Inflate(Resource.Layout.pdf_custom_layout, overlay);
_pdfControl.AddView(overlay);
}
但是什么也没发生,仍然没有显示叠加。
更新 2
我添加了修复程序并开始工作,但是,当我添加此代码时:
var overlay = new CustomRelativeLayout(BaseContext, _pdfControl, 50, 50, 1);
overlay.SetBackgroundColor(BaseContext.Resources.GetColor(Resource.Color.orange));
overlay.SetZoomWithParent(true);
_pdfControl.AddView(overlay);
overlay.LayoutParameters.Width = 300;
overlay.LayoutParameters.Height = 300;
_pdfControl.Invalidate();
overlay.RequestLayout();
我在页面位置 x=50 和 y50 处看到一个 50x50 的小矩形。我指定叠加层的宽度为 300,但它没有显示。
如果我添加这个,什么也不会显示,即使在 x=0,y =0 处的叠加层应该是 300x300。
var overlay = new CustomRelativeLayout(BaseContext, _pdfControl, 0, 0, 1);
需要将布局添加到视图层次结构(即 PDFViewCtrl.AddView),这在您的项目中没有完成。您可以在此处找到工作示例:
https://github.com/PDFTron/pdftron-android-samples/tree/master/CustomUI
具体来说,相关代码可以在这里找到: https://github.com/PDFTron/pdftron-android-samples/blob/master/CustomUI/app/src/main/java/com/pdftron/android/tutorial/customui/custom/CustomLinkClick.java
示例将布局添加到第 3 页,因为您的 pdf 文件只有 1 页,您需要在 XML 布局中将其更改为第 1 页。请注意,所有 posX 和 poxY 都在页面 space 中,而不是屏幕 space。在此处阅读有关该主题的更多信息: https://www.pdftron.com/documentation/android/guides/basics/coordinates
考虑到这一点,运行您的项目将看到:
布局:
<pdftron.PDF.Tools.CustomRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp"
app:posX="50"
app:posY="50"
app:pageNum="1"
app:zoomWithParent="true">
<!--Child views under CustomRelativeLayout-->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Custom Layout Text View"
android:textSize="12sp"
android:elevation="2dp"/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_dark" />
</pdftron.PDF.Tools.CustomRelativeLayout>
如果以编程方式添加视图,则需要指定位置,或者如果将其放在注释上,则可以指定注释。
通常看起来像这样:
CustomRelativeLayout overlay = new CustomRelativeLayout(context);
overlay.setBackgroundColor(context.getResources().getColor(R.color.orange));
overlay.setAnnot(pdfViewCtrl, annot, pageNum);
overlay.setZoomWithParent(true);
pdfViewCtrl.addView(overlay);