【发布时间】:2017-03-17 17:39:30
【问题描述】:
我想把一张图片分成 16 个部分并在一个 GridView 中显示。 但是在发送图像块数组时出现错误。 错误是“E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!”
这个错误的解决方法是什么???
ImageParse.java
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;
public class ImageParse extends AppCompatActivity {
Button btn_split;
ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_parse);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
btn_split = (Button)findViewById(R.id.btn_split);
image = (ImageView)findViewById(R.id.iv_split_image);
btn_split.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
splitImage(image, 16);
}
});
}
private void splitImage(ImageView image, int chunkNumbers)
{
int rows, cols;
int chunkHeight, chunkWidth;
ArrayList<Bitmap> chunkedImages = new ArrayList<>(chunkNumbers);
BitmapDrawable drawable = (BitmapDrawable)image.getDrawable();
Bitmap bitmap = drawable.getBitmap();
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);
rows = 4;
cols = 4;
chunkHeight = bitmap.getHeight() / rows;
chunkWidth = bitmap.getWidth() / cols;
int yCoord = 0;
for(int x=0; x < rows; x++)
{
int xCoord = 0;
for(int y=0; y < cols; y++)
{
chunkedImages.add(Bitmap.createBitmap(scaledBitmap, xCoord, yCoord, chunkWidth, chunkHeight));
xCoord += chunkWidth;
}
yCoord += chunkHeight;
}
Intent intent = new Intent(ImageParse.this, ImageChunksActivity.class);
Toast.makeText(this, "FLG1", Toast.LENGTH_SHORT).show();
intent.putExtra("image_chunks", chunkedImages);
startActivity(intent);
}
}
ImageChunksActivity.java
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.GridView;
import android.widget.Toast;
import com.navigationmenu.ListViewAdapter.ImageAdapter;
import java.util.ArrayList;
public class ImageChunksActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_chunks);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ArrayList<Bitmap> imageChunks = getIntent().getParcelableExtra("image_chunks");
GridView grid = (GridView) findViewById(R.id.gridImages);
grid.setAdapter(new ImageAdapter(this, imageChunks));
grid.setNumColumns((int) Math.sqrt(imageChunks.size()));
}
}
ImageAdapter.java
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import java.util.ArrayList;
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<Bitmap> imageChunks;
private int imageWidth;
private int imageHeight;
public ImageAdapter(Context c, ArrayList<Bitmap> images) {
this.mContext = c;
this.imageChunks = images;
this.imageWidth = ((Bitmap)images.get(0)).getWidth();
this.imageHeight = ((Bitmap)images.get(0)).getHeight();
}
public int getCount() {
return this.imageChunks.size();
}
public Object getItem(int position) {
return this.imageChunks.get(position);
}
public long getItemId(int position) {
return (long)position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView image;
if(convertView == null) {
image = new ImageView(this.mContext);
image.setLayoutParams(new AbsListView.LayoutParams(this.imageWidth - 10, this.imageHeight));
image.setPadding(0, 0, 0, 0);
} else {
image = (ImageView)convertView;
}
image.setImageBitmap((Bitmap)this.imageChunks.get(position));
return image;
}
}
【问题讨论】:
-
将这些位图存储在某处使用路径并在 gridview 中显示。
-
分割后是否应该将块保存在设备内存中?
-
任何你喜欢的地方。但是通过 putextra 发送位图是不对的。尽管我不确定确切的数字,但您可以发送的数据量也有限制
-
好的,我明白了。但是如何将设备保存在内存中?你能帮我解决这个问题吗?
-
你可以看到下面的答案。您可以使用片段在同一活动中显示网格。您可以在 stackvoerflow 上搜索帖子。您应该能够找到对您有帮助的帖子