【问题标题】:Android - Bitmap - Fatal Signal 11 (SIGSEGV), code 1Android - 位图 - 致命信号 11 (SIGSEGV),代码 1
【发布时间】:2017-10-21 14:29:40
【问题描述】:

我有一个项目,我需要像视图一样的自定义画布(白纸)。

活动分为两个部分

  1. 上述画布。

  2. 带有图像的列表/回收器视图(忽略临时 LinearLayout 而不是列表/回收器视图)

所以当我点击图片时。该图像将被转移到画布上。用户可以在其中拖动、缩放、旋转或对图像执行所有这些操作。此画布应最多同时支持 4-5 张图片。

我想知道是否有更好的选择,或者我正朝着正确的方向前进。

如果我朝着正确的方向前进。请帮我解决这个问题。

A/libc:致命信号 11 (SIGSEGV),代码 1,tid 18318 (odrob_sylvester) 中的故障地址 0x180

这是我的活动类 (CanvasActivity.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();
    }
}

activity_canvas.xml

<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>

自定义小部件画布 (WodrobView.java)

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();
    }
}

一个WodrobHandler.java

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;
    }
}

Product.java

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;
    }
}

Details.java

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;
    }
}

【问题讨论】:

    标签: android android-custom-view android-drawable android-bitmap


    【解决方案1】:

    我认为WodrobHandler 中的objects 是空的。你在哪里添加元素的代码?

    您必须将位图转换为可变位图并避免在 onDraw 中创建位图。在构造器上创建它。代码创建位图可变:

    Bitmap. createScaledBitmap(souce,souce.getWidth(),source.getHeight,false);
    

    【讨论】:

    • 好吧,我现在遇到了一个新错误。在 WodrobView.drawingImages(Canvas) 中,在 setWidth() 上出现错误“只能重新配置可变位图”;
    • 您必须将位图转换为可变位图,并避免在 onDraw 中创建位图。在构造器上创建它。代码创建位图可变:Bitmap. createBitmap(souce,souce.getWidth(),source.getHeight,false);
    • A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x180 in tid 16467 (odrob_sylvester) 现在得到了这个
    • 再次检查您的 logcat。它似乎有另一个错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多