- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个应用程序,它可以截取布局的屏幕截图,将其保存为 PDF,然后将其发送以通过 Google 云打印进行打印。一切正常,但我对屏幕截图的方向有疑问。
对于主机 fragment ,我同时制作了横向和纵向布局。屏幕截图必须始终为纵向,因此我们的想法是以编程方式将屏幕旋转为纵向,截取屏幕截图,然后将屏幕方向设置回传感器。我用这种方法更改配置:
public void lockScreenOrientation(String orientation) {
if (orientation.contains("portrait")) {
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if (orientation.contains("auto")) {
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
}
屏幕截图和 PDF 创建发生在 AsyncTask 中,该 AsyncTask 由主机 fragment 中的确认对话框触发
if (print) {
new AsyncPDF(mActivity).execute(field_client_name_txt, "birthday");
prefs.edit().putBoolean("Print", false).commit();
}
当方向为纵向时,一切正常!当必须将方向旋转为纵向以进行屏幕截图和打印时,就会出现问题。 屏幕截图捕获的是横向布局的图像,而不是纵向布局的图像,最终的 pdf 很乱且被裁剪了!
这里是我的 Asynctask 的引用:
public class AsyncPDF extends AsyncTask<String, Void, Void> {
Activity mActivity;
Context mContext;
private static final int REQUEST_CODE = 4;
private static String SDCARD = Environment.getExternalStorageDirectory().getPath();
private static String DIRECTORY = SDCARD + "/Amorino";
private static String DIR_CACHE = DIRECTORY + "/Cache/";
private static String DIR_BIRTHDAY_ORDERS = DIRECTORY + "/Orders/Birthday/";
private static String DIR_WEDDING_ORDERS = DIRECTORY + "/Orders/Wedding/";
private static String DIR_OTHER_ORDERS = DIRECTORY + "/Orders/Other/";
private static String DIR_PRODUCTION = DIRECTORY + "/Production/";
String pdfName, pdfType = "";
Utils mUtility;
public AsyncPDF(Activity activity) {
this.mActivity = activity;
this.mContext = activity;
}
@Override
protected void onPreExecute() {
mUtility = new Utils(mContext);
Toast.makeText(mActivity, "Αποθήκευση αρχείου...", Toast.LENGTH_SHORT)
.show();
screenCapture();
};
@Override
protected Void doInBackground(String... params) {
pdfName = params[0];
pdfType = params[1];
createPdf();
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
clearCacheFolder();
Toast.makeText(mActivity, "Το αρχείο αποθηκέυτηκε επιτυχώς!",
Toast.LENGTH_SHORT).show();
}
private void screenCapture() {
try {
ScrollView mLayoutRoot = (ScrollView) mActivity
.findViewById(R.id.print_screen_layout);
mLayoutRoot.setDrawingCacheEnabled(true);
mLayoutRoot.buildDrawingCache();
Bitmap mBitmap = mLayoutRoot.getDrawingCache();
File file, f = null;
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
file = new File(DIR_CACHE);
if (!file.exists()) {
file.mkdirs();
}
f = new File(file.getAbsolutePath() + File.separator
+ "temp_layout" + ".png");
}
FileOutputStream ostream = new FileOutputStream(f);
mBitmap.compress(CompressFormat.PNG, 10, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void createPdf() {
Document document = new Document();
Image header_img, main_img;
InputStream inputStream_header = null;
String current_directory = "";
try {
AssetManager mngr = mContext.getAssets();
if (pdfType.contains("birthday")) {
inputStream_header = mngr.open("header_birthday.png");
current_directory = DIR_BIRTHDAY_ORDERS;
} else if (pdfType.contains("wedding")) {
inputStream_header = mngr.open("header_wedding.png");
current_directory = DIR_WEDDING_ORDERS;
} else if (pdfType.contains("other")) {
inputStream_header = mngr.open("header_order.png");
current_directory = DIR_OTHER_ORDERS;
} else if (pdfType.contains("production")) {
inputStream_header = mngr.open("header_order.png");
current_directory = DIR_PRODUCTION;
}
File file = new File(current_directory);
if (!file.exists()) {
file.mkdirs();
}
PdfWriter.getInstance(document, new FileOutputStream(
current_directory + "/" + pdfName + ".pdf"));
document.open();
Bitmap bmp = BitmapFactory.decodeStream(inputStream_header);
ByteArrayOutputStream stream_header = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream_header);
header_img = Image.getInstance(stream_header.toByteArray());
header_img.scalePercent(24f);
header_img.setAbsolutePosition(-1f, 750f);
document.add(header_img);
Paragraph paragraph = new Paragraph(
header_img.getScaledHeight() + 50f);
document.add(paragraph);
main_img = Image.getInstance(DIR_CACHE
+ "/temp_layout.png");
main_img.scaleToFit(520f, 2000f);
main_img.setAlignment(Image.ALIGN_CENTER);
Log.d("Original Width: ", String.valueOf(main_img.getWidth()));
Log.d("Original Height ", String.valueOf(main_img.getHeight()));
Log.d("Scaled Width: ", String.valueOf(main_img.getScaledWidth()));
Log.d("Scaled Height ", String.valueOf(main_img.getScaledHeight()));
document.add(main_img);
document.close();
File f = new File(current_directory + "/" + pdfName + ".pdf");
printPdf(f, pdfName);
} catch (Exception e) {
e.printStackTrace();
}
}
private void printPdf(File f, String name) {
Uri docUri = Uri.fromFile(f);
Intent printIntent = new Intent(mContext, PrintDialogActivity.class);
printIntent.setDataAndType(docUri, "application/pdf");
printIntent.putExtra("title", name + ".pdf");
mActivity.startActivityForResult(printIntent, REQUEST_CODE);
}
private void clearCacheFolder() {
File dir = new File(DIR_CACHE);
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
new File(dir, children[i]).delete();
}
}
}
我认为故障发生在 mActivity 参数上。我认为它通过了原始横向布局而不是纵向布局的 fragment 。我尝试使用存储在 SharedPreference 中的“打印”标志,然后从 onResume 方法执行 AsyncTask 但没有成功。屏幕截图仍然抓取横向布局。有什么想法吗?
我应该在 fragment 生命周期的哪个点之后执行 AsyncTask 以获得正确的(纵向)布局?
附言第一个问题问!!
最佳答案
大约一周前我终于弄明白了,这就是解决方案!
问题已通过 this answer 的提示解决.我添加了一个GlobalLayoutListener,以便在新布局确定后启动AsyncPDF类,问题几乎解决了。后来我不得不处理一个新问题......!
PDF 现在打印了正确的布局,但一些 EditText 字段是空的!在经历了很多挫折、挠头和反复试验之后,我弄清楚了问题所在。 GlobalLayoutListener 按预期工作,但似乎它启动打印功能的时间有点过早,因此没有时间正确绘制/填充字段。
为了解决这个问题,我使用 Handler 类添加了一个最小延迟(100 毫秒),之后一切都按预期运行!这是打印方法的代码:
public void print(String orientation) {
print = prefs.getBoolean("print", false);
if (print)
if (orientation.contains("portrait")) {
new AsyncPDF(mActivity, v).execute(field_client_name_txt,
"birthday");
} else {
ViewTreeObserver observer = v.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
/* Adds a minimal wait time for the view to settle */
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
new AsyncPDF(mActivity, v).execute(
field_client_name_txt, "birthday");
}
}, 100);
v.getViewTreeObserver().removeOnGlobalLayoutListener(
this);
}
});
}
/* Reset the print flag to false */
prefs.edit().putBoolean("print", false).commit();
}
该方法从 ActionBar 中的打印按钮启动,如果我们已经在 Portrait 中,它会启动 AsyncPDF 类 imm。在横向的情况下,它会等待纵向布局稳定下来,然后添加 100 毫秒的延迟,然后启动 AsyncTask。
public void onClick(DialogInterface dialog, int id) {
prefs.edit().putBoolean("print", true).commit();
if (mUtility.getScreenOrientation() == 1)
print("portrait");
else
mUtility.lockScreenOrientation("portrait");
}
});
print(String orientation) 方法位于 onActivityCreated() 方法中,因此当配置更改发生时,它会检查是否触发了打印标志并采取相应行动。
关于android - 方向更改后以编程方式截取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24204212/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!