android 获取bundle 大小
时间: 2023-10-18 17:27:18 浏览: 52
你可以通过以下方式获取 Bundle 的大小:
```java
Bundle bundle = new Bundle();
// 添加数据到 Bundle 中
int size = getSizeInBytes(bundle);
```
其中 `getSizeInBytes()` 方法的实现如下:
```java
public static int getSizeInBytes(Bundle bundle) {
Parcel parcel = Parcel.obtain();
bundle.writeToParcel(parcel, 0);
int size = parcel.dataSize();
parcel.recycle();
return size;
}
```
该方法先利用 `Parcel` 将 Bundle 序列化到内存中,然后获取序列化后的数据大小,最后释放内存,返回数据大小。注意,这里获取的大小仅包括 Bundle 中的数据,不包括 Bundle 对象本身的开销。
相关问题
android 图片实现平移 伸缩 双指控制伸缩大小
要实现 Android 中图片的平移和伸缩,您可以使用 GestureDetector 和 ScaleGestureDetector 类。
首先,您需要创建一个 ImageView 对象,并在其中加载您想要显示的图片。然后,您可以为 ImageView 添加一个 OnTouchListener,并在 onTouch 方法中检测手势事件。
在 onTouch 方法中,您可以通过 GestureDetector 来检测单指的滑动手势,从而实现图片的平移。您可以在每次滑动结束后,通过 ImageView 的 setImageMatrix 方法来更新图片的位置。
同时,您可以使用 ScaleGestureDetector 来检测双指的缩放手势,并通过 Matrix 的 postScale 方法来实现图片的伸缩。在缩放过程中,您可以通过 ScaleGestureDetector 的 getCurrentSpan 方法来获取当前手指间的距离,并通过计算缩放前后的比例来确定缩放大小。
最后,您需要在每次缩放或平移结束后,通过 ImageView 的 setImageMatrix 方法来更新图片的位置和大小。
以下是一个示例代码,可以帮助您更好地理解如何实现图片的平移和伸缩:
```
public class MainActivity extends AppCompatActivity implements OnTouchListener, GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener {
private ImageView mImageView;
private GestureDetector mGestureDetector;
private ScaleGestureDetector mScaleGestureDetector;
private Matrix mMatrix = new Matrix();
private float mScaleFactor = 1.0f;
private float mLastX, mLastY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = findViewById(R.id.imageView);
mImageView.setOnTouchListener(this);
mGestureDetector = new GestureDetector(this, this);
mScaleGestureDetector = new ScaleGestureDetector(this, this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
mGestureDetector.onTouchEvent(event);
mScaleGestureDetector.onTouchEvent(event);
return true;
}
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
float moveX = e2.getX() - mLastX;
float moveY = e2.getY() - mLastY;
mMatrix.postTranslate(-moveX, -moveY);
mImageView.setImageMatrix(mMatrix);
mLastX = e2.getX();
mLastY = e2.getY();
return true;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
mMatrix.setScale(mScaleFactor, mScaleFactor);
mImageView.setImageMatrix(mMatrix);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
}
```
希望这个示例代码可以帮助您实现图片的平移和伸缩。
android 打印
您好,要在 Android 应用程序中进行打印,可以使用 Android 打印框架(Android Printing Framework)。以下是一个简单的示例,演示如何使用打印框架:
1. 在 AndroidManifest.xml 文件中添加打印机权限:
```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<uses-feature
android:name="android.hardware.usb.host"
android:required="false" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
```
2. 在您的应用程序中创建一个打印类,实现PrintDocumentAdapter接口
```java
public class MyPrintDocumentAdapter extends PrintDocumentAdapter {
private Context mContext;
private PrintedPdfDocument mPdfDocument;
private int mPageHeight;
private int mPageWidth;
private int mTotalPages;
public MyPrintDocumentAdapter(Context context) {
mContext = context;
}
@Override
public void onStart() {
super.onStart();
// 初始化打印文档
mPdfDocument = new PrintedPdfDocument(mContext, getPrintAttributes());
}
@Override
public void onFinish() {
super.onFinish();
// 释放资源
mPdfDocument.close();
mPdfDocument = null;
}
@Override
public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) {
// 获取打印页面大小
mPageHeight = newAttributes.getMediaSize().getHeightMils() / 1000 * 72;
mPageWidth = newAttributes.getMediaSize().getWidthMils() / 1000 * 72;
// 计算总页数
mTotalPages = 1;
// 检查是否取消打印
if (cancellationSignal.isCanceled()) {
callback.onLayoutCancelled();
return;
}
// 创建打印页面
PrintDocumentInfo.Builder builder = new PrintDocumentInfo.Builder("print_output.pdf")
.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(mTotalPages);
PrintDocumentInfo info = builder.build();
callback.onLayoutFinished(info, true);
}
@Override
public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) {
// 创建渲染器
PdfRenderer renderer = new PdfRenderer(mPdfDocument);
// 渲染每一页
for (int i = 0; i < mTotalPages; i++) {
// 检查是否取消打印
if (cancellationSignal.isCanceled()) {
callback.onWriteCancelled();
renderer.close();
return;
}
// 获取打印页面
PdfRenderer.Page page = renderer.openPage(i);
// 创建画布
Bitmap bitmap = Bitmap.createBitmap(mPageWidth, mPageHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
// 将页面渲染到画布上
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_PRINT);
// 将画布保存到 PDF 文档中
PdfDocument.Page pdfPage = mPdfDocument.startPage(i + 1);
canvas.drawBitmap(bitmap, 0, 0, null);
mPdfDocument.finishPage(pdfPage);
// 释放资源
page.close();
}
// 写入 PDF 文档到输出流
try {
OutputStream outputStream = new FileOutputStream(destination.getFileDescriptor());
mPdfDocument.writeTo(outputStream);
callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES});
} catch (IOException e) {
callback.onWriteFailed(e.toString());
} finally {
mPdfDocument.close();
mPdfDocument = null;
renderer.close();
}
}
}
```
3. 在您的应用程序中调用打印服务
```java
PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE);
String jobName = getString(R.string.app_name) + " Document";
printManager.print(jobName, new MyPrintDocumentAdapter(this), null);
```
以上是一个简单的示例,演示如何使用打印框架在 Android 应用程序中进行打印。您可以根据您的需求进行修改和扩展。