Android-位图-致命信号11(SIGSEGV),代码1
我有一个项目,我需要一个自定义画布(白纸)像一个视图 该活动将分为两个部分Android-位图-致命信号11(SIGSEGV),代码1,android,android-custom-view,android-drawable,android-bitmap,Android,Android Custom View,Android Drawable,Android Bitmap,我有一个项目,我需要一个自定义画布(白纸)像一个视图 该活动将分为两个部分 前面提到的画布 带有图像的列表/回收器视图(忽略临时线性布局,而不是列表/回收器视图) 所以当我点击一张图片。此图像将被传输到画布。用户可以在其中拖动、缩放、旋转或将所有这些操作一起执行到该图像。此画布应同时支持多达4-5个图像 我想知道是否有更好的选择,或者我会朝着正确的方向走 如果我走对了方向。请在这个问题上帮助我 A/libc:tid 18318中的致命信号11(SIGSEGV),代码1,故障地址0x180(odr
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.wodrob.wodrob_sylvester.CanvasActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/card_margin_horizontal"
android:background="#ffffff"
android:elevation="@dimen/canvas_elevation">
<com.example.wodrob.wodrob_sylvester.widget.WodrobView
android:id="@+id/canvas"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="250dp" />
</FrameLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/card_margin_horizontal"
android:foreground="?attr/selectableItemBackground"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:clickable="true"
android:scaleType="fitXY"
android:background="@color/black"
android:padding="1dp"
android:onClick="img1click"
android:src="@drawable/wodrob_1" />
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:scaleType="fitXY"
android:background="@color/black"
android:padding="1dp"
android:src="@drawable/wodrob_2" />
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:scaleType="fitXY"
android:background="@color/black"
android:padding="1dp"
android:src="@drawable/wodrob_3" />
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:scaleType="fitXY"
android:background="@color/black"
android:padding="1dp"
android:src="@drawable/wodrob_4" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Details.java
public class CanvasActivity extends AppCompatActivity {
private static final String TAG = CanvasActivity.class.getSimpleName();
private WodrobView canvas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_canvas);
canvas = (WodrobView) findViewById(R.id.canvas);
}
public void img1click(View view) {
Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.wodrob_1);
Product product = new Product(image);
Details details = new Details("Wodrob_1", "123", 123);
product.setDetails(details);
WodrobHandler.addObjectToWODROB(product);
Log.d(TAG, "img1click called");
canvas.updateCanvas();
}
}
public class WodrobView extends View {
private static final String TAG = WodrobView.class.getSimpleName();
private Context mContext;
public WodrobView(Context context) {
super(context);
mContext = context;
}
public WodrobView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
public WodrobView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
}
@Override
public void draw(final Canvas canvas) {
super.draw(canvas);
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
drawingImages(canvas);
}
});
}
private void drawingImages(Canvas canvas){
Map<Point, Product> drawMap = WodrobHandler.getObjects();
for (Point point : drawMap.keySet()){
Product product = drawMap.get(point);
if (product.isAdded()) {
Log.w(TAG, product.getDetails().getName() + " is already added!");
continue;
}
Bitmap bitmap = product.getBitmap();
Bitmap bitmapTemp = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() / 2, bitmap.getHeight() / 2, false);
canvas.drawBitmap(bitmapTemp, point.x, point.y, new Paint(Paint.ANTI_ALIAS_FLAG));
}
}
public void updateCanvas() {
invalidate();
}
}
public class WodrobHandler implements WodrobHelper {
interface WodrobHelper {
Point[] POINTS = new Point[]{
new Point(10, 10),
new Point(10, 10),
new Point(10, 10),
new Point(10, 10)
};
}
private static final String TAG = WodrobHandler.class.getSimpleName();
private static Map<Point, Product> objects = new HashMap<>();
private static short position = 0;
public static boolean addObjectToWODROB(Product product){
if (position >= 4 || position < 0){
Set<Point> pointSet = objects.keySet();
for (Point point:POINTS) {
short flag = 0;
for (Point point1:pointSet) {
if (point.equals(point1.x, point1.y))
flag++;
}
if (flag == 0) {
objects.put(point, product);
return true;
}
}
Log.e(TAG, "Invalid position or full");
return false;
} else {
objects.put(POINTS[position++], product);
return true;
}
}
public static boolean removeObjectFromWODROB(Product product){
if (!objects.containsValue(product)){
Log.e(TAG, "No such product to remove");
return false;
}
objects.remove(product.getPoint());
return true;
}
public static Map<Point, Product> getObjects() {
return objects;
}
public static void setObjects(Map<Point, Product> objects) {
WodrobHandler.objects = objects;
}
}
public class Product {
private Bitmap bitmap;
private Details details;
Point point = null;
private boolean added = false;
public boolean isAdded() {
return added;
}
public void setAdded(boolean added) {
this.added = added;
}
public Product(Bitmap bitmap) {
//Getting bitmap from drawable resource
this.bitmap = bitmap;
}
public Bitmap getBitmap() {
return bitmap;
}
public Details getDetails() {
return details;
}
public Point getPoint() {
return point;
}
public void setPoint(Point point) {
this.point = point;
}
public void setDetails(Details details) {
this.details = details;
}
}
public class Details {
private String name, id;
private int cost;
public Details(String name, String id, int cost) {
this.name = name;
this.id = id;
this.cost = cost;
}
public String getName() {
return name;
}
public String getId() {
return id;
}
public int getCost() {
return cost;
}
}
我认为
WodrobHandler
中的objects
是空的。添加元素的代码在哪里
您必须将位图转换为可变的,并避免在onDraw中创建位图。在Constructor上创建它。创建位图可变的代码:
Bitmap. createScaledBitmap(souce,souce.getWidth(),source.getHeight,false);
嗯,我现在有一个新的错误。在WodrobView.drawingImages(Canvas)中,在setWidth()上出现错误“只能重新配置可变位图”;您必须将位图转换为可变的,并避免在onDraw中创建位图。在Constructor上创建它。代码创建位图可变:
位图。createBitmap(souce,souce.getWidth(),source.getHeight,false)代码>A/libc:tid 16467中的致命信号11(SIGSEGV),代码1,故障地址0x180(odrob_sylvester)现在收到此消息再次检查日志。它似乎有另一个错误消息。