4

I am getting the error as

android.view.InflateException: Binary XML file line #16: Error inflating class DrawView

. I am creating customize view in DrawView class. In Oncreate method while calling setContentView(R.layout.newimage_activity); it will show me above error.

XML layout is:

    <com.capricorn.RayMenu
    android:id="@+id/ray_menu"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="5dp"
    android:paddingRight="5dp" />

    <com.element45.android.camera.activities.DrawView
    android:id="@+id/CustomView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white" 
     tools:context="com.element45.android.camera.activities.newImage_Activity"
    />

And DrawView Class code is:

public class DrawView extends View {

    private Bitmap  mBitmap;
    private Canvas  mCanvas;
    private Path    mPath;
    private Paint   mBitmapPaint;
    private Paint   mPaint;

    private RectF   rectF ;
    private Region  Region1;
    private Region  Region2;
    private List<Point> mPoints;
    private List<Line> mLines;
    private boolean bModify_line;
    private float mX, mY;
    private float mOriginal_X, mOriginal_Y;

    private Line mLine ;
    private static final float TOUCH_TOLERANCE = 50;


    public DrawView(Context c) 
    {
        super(c);
        rectF = new RectF();
        mPath = new Path();
        mPath.computeBounds(rectF, true);
        mPaint =  new Paint();
        mPaint.setColor(Color.WHITE);
        mPaint.setAntiAlias(true);
        mPaint.setXfermode(null);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        mPoints = new ArrayList<Point>();
        mLines  = new ArrayList<Line>();
        bModify_line =  false;

    }

    int width,height;
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        width = w ; height =h;

    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);
        canvas.drawColor(0xFFAAAAAA);//original color 0xFFAAAAAA
        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
        for(int i = 0 ; i < mLines.size();i++)
        {
            Line line = mLines.get(i);
            mCanvas.drawLine(line.getStartPoint().x, line.getStartPoint().y, line.getEndPoint().x, line.getEndPoint().y, mPaint);
        }

    }


    private void touch_move(float x, float y) 
    {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) 
        {
            mX = x;
            mY = y;
        }
    }

    private void touch_start(float x, float y) 
    {
        int  iLineNumber = checkPointinLines(x, y);

        if(iLineNumber >= 0 )
        {
            bModify_line  = true;
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        else
        {
            mLine =  new Line();
            mLine.setStartPoint(new Point((int)x, (int)y));
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        mOriginal_X =  mX;
        mOriginal_Y =  mY;
    }

    private void touch_up() 
    {

        if(bModify_line)
        {
            int  iLineNumber = checkPointinLines(mOriginal_X, mOriginal_Y);
            if(iLineNumber > -1)
            {
                Line line = mLines.get(iLineNumber);
                int iPoint = checkPointOnLine(mX,mY,line);
                if(iPoint >= 0)
                {
                    if(iPoint == 0)
                    {
                        mPath.moveTo(line.getEndPoint().x, line.getEndPoint().y);
                        line.setStartPoint(new Point((int)mX, (int)mY));

                    }
                    else if(iPoint == 1)
                    {
                        mPath.moveTo(line.getStartPoint().x, line.getStartPoint().y);
                        line.setEndPoint(new Point((int)mX, (int)mY));
                    }

                    mLines.set(iLineNumber, line);
                    System.out.println("After setline size of lineArray::"+mLines.size());

                    bModify_line = false;
                }
            }
        }
        else
        {
            mPath.lineTo(mX, mY);
            mLine.setEndPoint(new Point((int)mX, (int)mY));
            mLines.add(mLine);
            mPath.reset();
        }

    }





    @Override
    public boolean onTouchEvent(MotionEvent event) 
    {
        float x = event.getX();
        float y = event.getY();

        switch (event.getAction()) 
        {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;
        }
        return true;
    }


    /**
     * Checks if user touch point with some tolerance
     */
    private int checkPointOnLine(float x, float y,Line line) 
    {
        int iPoint = -1; 

        Point point = line.getStartPoint();

        if(x > (point.x - TOUCH_TOLERANCE) && x < (point.x + TOUCH_TOLERANCE) && y > (point.y - TOUCH_TOLERANCE) && y < (point.y + TOUCH_TOLERANCE) )
            iPoint = 0;

        point = line.getEndPoint();

        if (x > (point.x - TOUCH_TOLERANCE) && x < (point.x + TOUCH_TOLERANCE) && (y > (point.y - TOUCH_TOLERANCE) && y < (point.y + TOUCH_TOLERANCE) ))

            iPoint = 1 ;


        return iPoint;
    }


    private int checkPointinLines(float x, float y) 
    {
        int iLine = -1; 
        for(int i=0 ;i < mLines.size();i++)
        {
            Line line = mLines.get(i);

            if(x > (line.getStartPoint().x - TOUCH_TOLERANCE) 
                    && x < (line.getStartPoint().x + TOUCH_TOLERANCE) 
                    && y > (line.getStartPoint().y - TOUCH_TOLERANCE) 
                    && y < (line.getStartPoint().y + TOUCH_TOLERANCE) 
                    ||
                    x > (line.getEndPoint().x - TOUCH_TOLERANCE) 
                    && x < (line.getEndPoint().x + TOUCH_TOLERANCE) 
                    && y > (line.getEndPoint().y - TOUCH_TOLERANCE) 
                    && y < (line.getEndPoint().y + TOUCH_TOLERANCE))
                iLine = i;

        }
        return iLine;
    }

    public void movePoint(int position)
    {
        switch(position)
        {
        case 0:
            //up
            movePointUp();
            break;
        case 1:
            //Right
            movePointRight();
            break;
        case 2:
            //Down
            movePointDown();
            break;
        case 3:
            //Left
            movePointLeft();
            break;

        }
    }

    private void movePointUp()
    {
        if(bModify_line)
        {
            int  iLineNumber = checkPointinLines(mOriginal_X, mOriginal_Y);
            if(iLineNumber > -1)
            {
                Line line = mLines.get(iLineNumber);
                int iPoint = checkPointOnLine(mX,mY,line);
                if(iPoint >= 0)
                {
                    int modifyPointX,modifyPointY;
                    if(iPoint == 0)
                    {
                        modifyPointX = line.getStartPoint().x ;
                        modifyPointY = line.getStartPoint().y - 2;
                        mPath.moveTo(line.getEndPoint().x, line.getEndPoint().y);
                        line.setStartPoint(new Point(modifyPointX, modifyPointY));
                    }
                    else if(iPoint == 1)
                    {
                        modifyPointX = line.getEndPoint().x;
                        modifyPointY = line.getEndPoint().y -2;
                        mPath.moveTo(line.getStartPoint().x, line.getStartPoint().y);
                        line.setEndPoint(new Point(modifyPointX, modifyPointY));
                    }

                    mLines.set(iLineNumber, line);
                    bModify_line = false;
                }
            }
        }
        else
        {
            Toast.makeText(getContext(), "Please select point", Toast.LENGTH_SHORT).show();
        }

    }

    private void movePointRight()
    {
        if(bModify_line)
        {
            int  iLineNumber = checkPointinLines(mOriginal_X, mOriginal_Y);
            if(iLineNumber > -1)
            {
                Line line = mLines.get(iLineNumber);
                int iPoint = checkPointOnLine(mX,mY,line);
                if(iPoint >= 0)
                {
                    int modifyPointX,modifyPointY;
                    if(iPoint == 0)
                    {
                        modifyPointX = line.getStartPoint().x + 2;
                        modifyPointY = line.getStartPoint().y ;
                        mPath.moveTo(line.getEndPoint().x, line.getEndPoint().y);
                        line.setStartPoint(new Point(modifyPointX, modifyPointY));
                    }
                    else if(iPoint == 1)
                    {
                        modifyPointX = line.getEndPoint().x + 2;
                        modifyPointY = line.getEndPoint().y ;
                        mPath.moveTo(line.getStartPoint().x, line.getStartPoint().y);
                        line.setEndPoint(new Point(modifyPointX, modifyPointY));
                    }

                    mLines.set(iLineNumber, line);
                    bModify_line = false;
                }
            }
        }
        else
        {
            Toast.makeText(getContext(), "Please select point", Toast.LENGTH_SHORT).show();
        }
    }

    private void movePointLeft()
    {
        if(bModify_line)
        {
            int  iLineNumber = checkPointinLines(mOriginal_X, mOriginal_Y);
            if(iLineNumber > -1)
            {
                Line line = mLines.get(iLineNumber);
                int iPoint = checkPointOnLine(mX,mY,line);
                if(iPoint >= 0)
                {
                    int modifyPointX,modifyPointY;
                    if(iPoint == 0)
                    {
                        modifyPointX = line.getStartPoint().x - 2 ;
                        modifyPointY = line.getStartPoint().y ;
                        mPath.moveTo(line.getEndPoint().x, line.getEndPoint().y);
                        line.setStartPoint(new Point(modifyPointX, modifyPointY));
                    }
                    else if(iPoint == 1)
                    {
                        modifyPointX = line.getEndPoint().x - 2;
                        modifyPointY = line.getEndPoint().y ;
                        mPath.moveTo(line.getStartPoint().x, line.getStartPoint().y);
                        line.setEndPoint(new Point(modifyPointX, modifyPointY));
                    }

                    mLines.set(iLineNumber, line);
                    bModify_line = false;
                }
            }
        }
        else
        {
            Toast.makeText(getContext(), "Please select point", Toast.LENGTH_SHORT).show();
        }
    }

    private void movePointDown()
    {
        if(bModify_line)
        {
            int  iLineNumber = checkPointinLines(mOriginal_X, mOriginal_Y);
            if(iLineNumber > -1)
            {
                Line line = mLines.get(iLineNumber);
                int iPoint = checkPointOnLine(mX,mY,line);
                if(iPoint >= 0)
                {
                    int modifyPointX,modifyPointY;
                    if(iPoint == 0)
                    {
                        modifyPointX = line.getStartPoint().x ;
                        modifyPointY = line.getStartPoint().y + 2;
                        mPath.moveTo(line.getEndPoint().x, line.getEndPoint().y);
                        line.setStartPoint(new Point(modifyPointX, modifyPointY));
                    }
                    else if(iPoint == 1)
                    {
                        modifyPointX = line.getEndPoint().x;
                        modifyPointY = line.getEndPoint().y + 2;
                        mPath.moveTo(line.getStartPoint().x, line.getStartPoint().y);
                        line.setEndPoint(new Point(modifyPointX, modifyPointY));
                    }

                    mLines.set(iLineNumber, line);
                    bModify_line = false;
                }
            }
        }
        else
        {
            Toast.makeText(getContext(), "Please select point", Toast.LENGTH_SHORT).show();
        }

    }
}

1 Answer 1

3

for the xml inflation you need to override the constructor that takes Context and AttributeSet as parameter. From the documentation

Constructor that is called when inflating a view from XML.

Add

public DrawView(Context c, AttributeSet attrs) {
     super(c, attrs);
}

to your custom view. You could have a common init() method that you share between the two constructors where you perform your initialization (in order to avoid code duplicates)

Sign up to request clarification or add additional context in comments.

1 Comment

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.