主叫功能的Andr​​oid零异常 [英] Android Null Exception on Calling function

查看:115
本文介绍了主叫功能的Andr​​oid零异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过颜色传递整数作为参数来改变颜色上按一下按钮,但点击了Android抛出的空指针异常错误。和应用程序崩溃..我坚持在这里好心帮我请 函数名SetColor()

  MyView的类

  公共类MyView的延伸活动{

   按钮brushLarge;
   按钮brushMeduim;
   按钮brushSmall;
   按钮擦除;
   按钮保存;
   按钮垃圾桶;
   按钮的彩虹;
   按钮颜色1;
    按钮颜色2;
        按钮COLOR3;
     this.color1 =((按钮)findViewById(R.id.color1));
     this.color2 =((按钮)findViewById(R.id.color2));
     this.color3 =((按钮)findViewById(R.id.color3));
      this.color1.setOnClickListener(新View.OnClickListener()
      {
        公共无效的onClick(查看paramView)
        {
     Toast.makeText(getApplicationContext(),颜色1,Toast.LENGTH_LONG).show();
          //MyView.this.coloringView.setColor("#CD5C5C);
        }
      });
      this.color2.setOnClickListener(新View.OnClickListener()
      {
        公共无效的onClick(查看paramView)
        {
            //DrawView.changePaintColor(0xFFFF0000);0);
            尝试
            {coloringView.changePaintColor(0xFFFF0000地址);
            }
            赶上(例外五)
            {
  Toast.makeText(getApplicationContext(),颜色1+ E,Toast.LENGTH_LONG).show();
            }
            //coloringView.changePaintColor(0xFFFF0000);
        }
      });
      this.color3.setOnClickListener(新View.OnClickListener()
      {
        公共无效的onClick(查看paramView)
        {
          MyView.this.coloringView.setColor(#FA8072);
        }
      });
      返回;
    }
}

  drawView函数类

    公共类drawView函数扩展视图{
    民营涂料粉刷=新的油漆();
    私人路径路径=新路径();
    民营涂料circlePaint =新的油漆();
    私人路径circlePath =新路径();
    帆布mCanvas;
    串色=#ffee22;


      公共drawView函数(上下文的背景下,ATTRS的AttributeSet){
            超(背景下,ATTRS);

        paint.setAntiAlias​​(真正的);
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeWidth(15F);

        circlePaint.setAntiAlias​​(真正的);
        circlePaint.setColor(Color.BLUE);
        circlePaint.setStyle(Paint.Style.STROKE);
        circlePaint.setStrokeJoin(Paint.Join.MITER);
        circlePaint.setStrokeWidth(4F);
mCanvas =新的Canvas();
    }
       公共无效changePaintColor(INT颜色){
            this.paint.setColor(颜色);
        }

    @覆盖
    保护无效的OnDraw(帆布油画){

        canvas.drawPath(路径,油漆);
        canvas.drawPath(circlePath,circlePaint);
    }

    @覆盖
    公共布尔的onTouchEvent(MotionEvent事件){

        //为您提供关于事件的X和Y坐标。
        浮pointX = event.getX();
        浮尖尖= event.getY();

        //检查是否发生的事件
        开关(event.getAction()){
        案例MotionEvent.ACTION_DOWN:
            path.moveTo(pointX,尖尖的);

            返回true;
        案例MotionEvent.ACTION_MOVE:
            path.lineTo(pointX,尖尖的);
            circlePath.reset();

            //(圆的圆心x坐标,y坐标,半径
            //圆,方向风的形状)
            circlePath.addCircle(pointX,尖尖的,30,Path.Direction.CW);
            //circlePath.addRect(pointX  -  25,尖 -  25,pointX + 25,尖尖+ 25,Path.Direction.CW);
/ * RectF RECT =新RectF(pointX  -  25,尖 -  25,pointX + 25,尖尖+ 25);
            circlePath.addRoundRect(矩形,0,0,Path.Direction.CW);
* /
            打破;

        案例MotionEvent.ACTION_UP:
            circlePath.reset();

            打破;
        默认:
            返回false;
        }

        //时间表重绘。
        //强制视图来绘制。
        postInvalidate();
        返回true;
    }
/////功能 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
    公共无效的苹果()
    {
    // paint.setColor(AP);
        //Toast.makeText(的getContext(),拉赫曼,Toast.LENGTH_SHORT).show();
        this.paint.setColor(0xFF0000FF);


    }


    公共无效setColor(串色)
    {


        this.paint.setColor(0xFF0000FF);
    }
    公共无效onSizeChange(INT paramInt)
      {
       paint.setStrokeWidth(paramInt);
      }
      公共无效清除()
      {
        如果(this.mCanvas!= NULL)
        {
          this.paint.setARGB(255,255,255,255);
          mCanvas.drawPaint(this.paint);
          无效();
          paint.setColor(Color.parseColor(this.color));
        }
      }

}
 

解决方案

您需要重写的onCreate

  @覆盖
   保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);
    this.color1 =((按钮)findViewById(R.id.color1));
    this.color2 =((按钮)findViewById(R.id.color2));
    this.color3 =((按钮)findViewById(R.id.color3));
    ... //的code休息
    }
 

您需要的活动首先设置布局的内容,然后intialize意见。

另外你需要添加图形视图布局。

的onCreate

 的LinearLayout LL =(的LinearLayout)findViewById(R.layout.linearlayout);
     //假设你已经在你的XML线性布局中添加图形视图lineasrlayout
     //你可以有相对布局也
     DrawingView视图=新DrawingView(本);
     ll.addView(查看);
 

修改

 公共类MainActivity扩展活动
        实现ColorPickerDialog.OnColorChangedListener {

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(新MyView的(这个));
      // circlePaint =新的油漆();
        // circlePath =新路径();
        //circlePaint.setAntiAlias​​(true);
        //circlePaint.setColor(Color.BLUE);
        //circlePaint.setStyle(Paint.Style.STROKE);
        //circlePaint.setStrokeJoin(Paint.Join.MITER);
        //circlePaint.setStrokeWidth(4f);
        //circlePath.reset();
        //circlePath.addCircle(mX,我,30,Path.Direction.CW);
        mPaint =新的油漆();
        mPaint.setAntiAlias​​(真正的);
        mPaint.setDither(真正的);
        mPaint.setColor(0xFFFF0000地址);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap​​(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);

        mEmboss =新EmbossMaskFilter(新浮法[] {1,1,1},
                                       0.4f,6,3.5F);

        运动模糊=新BlurMaskFilter(8,BlurMaskFilter.Blur.NORMAL);
    }

    私人油漆mPaint;
    私人MaskFilter将mEmboss;
    私人MaskFilter将运动模糊;

    公共无效colorChanged(INT颜色){
        mPaint.setColor(颜色);
    }

    公共类MyView的扩展视图{

        私有静态最终浮动MINP = 0.25f;
        私有静态最终浮动MAXP = 0.75f​​;

        私人位图mBitmap;
        私人帆布mCanvas;
        私人路径的mpath,circlePath;
        私人油漆mBitmapPaint,circlePaint;

        公共MyView的(语境C){
            超级(C);
            circlePaint =新的油漆();
            circlePath =新路径();
            circlePaint.setAntiAlias​​(真正的);
            circlePaint.setColor(Color.BLUE);
            circlePaint.setStyle(Paint.Style.STROKE);
            circlePaint.setStrokeJoin(Paint.Join.MITER);
            circlePaint.setStrokeWidth(4F);

            的mpath =新路径();
            mBitmapPaint =新的油漆(Paint.DITHER_FLAG);
        }

        @覆盖
        保护无效onSizeChanged(INT W,INT小时,INT oldw,诠释oldh){
            super.onSizeChanged(W,H,oldw,oldh);
            mBitmap = Bitmap.createBitmap(W,H,Bitmap.Config.ARGB_8888);
            mCanvas =新的Canvas(mBitmap);
        }

        @覆盖
        保护无效的OnDraw(帆布油画){
            canvas.drawColor(0xFFAAAAAA);

            canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);

            canvas.drawPath(的mpath,mPaint);
            canvas.drawPath(circlePath,circlePaint);
        }

        私人浮动MX,我的;
        私有静态最终浮动TOUCH_TOLERANCE = 4;

        私人无效touch_start(浮X,浮动Y){
            mPath.reset();
            mPath.moveTo(X,Y);
            MX = X;
            我= Y;
        }
        私人无效TOUCH_MOVE(浮X,浮动Y){
            浮DX = Math.abs(X  -  MX);
            浮DY = Math.abs(Y  - 我的);
            如果(DX> = TOUCH_TOLERANCE || DY> = TOUCH_TOLERANCE){
                mPath.quadTo(MX,MY,(X + MX)/ 2,(Y +我)/ 2);
                MX = X;
                我= Y;
            }
            circlePath.reset();
            circlePath.addCircle(MX,我,30,Path.Direction.CW);
        }
        私人无效touch_up(){
            mPath.lineTo(MX,MY);
            //提交路径,我们的屏幕外
            mCanvas.drawPath(的mpath,mPaint);
            //杀了这个,所以我们不重复抽奖
            circlePath.reset();
            mPath.reset();
        }

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX();
            浮动Y = event.getY();

            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    touch_start(X,Y​​);
                    无效();
                    打破;
                案例MotionEvent.ACTION_MOVE:
                    TOUCH_MOVE(X,Y);
                    无效();
                    打破;
                案例MotionEvent.ACTION_UP:
                    润色();
                    无效();
                    打破;
            }
            返回true;
        }
    }

    私有静态最终诠释COLOR_MENU_ID = Menu.FIRST;
    私有静态最终诠释EMBOSS_MENU_ID = Menu.FIRST + 1;
    私有静态最终诠释BLUR_MENU_ID = Menu.FIRST + 2;
    私有静态最终诠释ERASE_MENU_ID = Menu.FIRST + 3;
    私有静态最终诠释SRCATOP_MENU_ID = Menu.FIRST + 4;

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        super.onCreateOptionsMenu(菜单);

        menu.add(0,COLOR_MENU_ID,0,颜色)setShortcut('3','c')中。
        menu.add(0,EMBOSS_MENU_ID,0,浮雕)setShortcut('4','s'的)。
        menu.add(0,BLUR_MENU_ID,0,模糊)setShortcut('5','Z')。
        menu.add(0,ERASE_MENU_ID,0,擦除)setShortcut('5','Z')。
        menu.add(0,SRCATOP_MENU_ID,0,SrcATop)setShortcut('5','Z')。

        / ****这是该机制与滤镜效果延伸?
        意向意图=新的意图(空,getIntent()的getData());
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        menu.addIntentOptions(
                              Menu.ALTERNATIVE,0,
                              新的组件名(本,NotesList.class)
                              空,意向,0,NULL);
        ***** /
        返回true;
    }

    @覆盖
    公共布尔prepareOptionsMenu(功能菜单)在{
        super.on prepareOptionsMenu(菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        mPaint.setXfermode(空);
        mPaint.setAlpha(0xFF的);

        开关(item.getItemId()){
            案例COLOR_MENU_ID:
                新ColorPickerDialog(这个,这​​个,mPaint.getColor())显示()。
                返回true;
            案例EMBOSS_MENU_ID:
                如果(mPaint.getMaskFilter()!= mEmboss){
                    mPaint.setMaskFilter(mEmboss);
                } 其他 {
                    mPaint.setMaskFilter(空);
                }
                返回true;
            案例BLUR_MENU_ID:
                如果(mPaint.getMaskFilter()!=运动模糊){
                    mPaint.setMaskFilter(运动模糊);
                } 其他 {
                    mPaint.setMaskFilter(空);
                }
                返回true;
            案例ERASE_MENU_ID:
                mPaint.setXfermode(新PorterDuffXfermode(
                                                        PorterDuff.Mode.CLEAR));
                返回true;
            案例SRCATOP_MENU_ID:
                mPaint.setXfermode(新PorterDuffXfermode(
                                                    PorterDuff.Mode.SRC_ATOP));
                mPaint.setAlpha(0x80的);
                返回true;
        }
        返回super.onOptionsItemSelected(项目);
    }
}
 

Col​​orPickerDialog

 公共类ColorPickerDialog扩展对话框{

    公共接口OnColorChangedListener {
        无效colorChanged(INT颜色);
    }

    私人OnColorChangedListener mListener;
    私人诠释mInitialColor;

    私有静态类ColorPickerView扩展视图{
        私人油漆mPaint;
        私人油漆mCenterPaint;
        私人最终诠释[] mColors;
        私人OnColorChangedListener mListener;

        ColorPickerView(上下文C,OnColorChangedListener L,INT的颜色){
            超级(C);
            mListener =升;
            mColors =新INT [] {
                0xFFFF0000地址,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,
                0xFFFFFF00,0xFFFF0000地址
            };
            着色器S =新SweepGradient(0,0,mColors,NULL);

            mPaint =新的油漆(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(多个);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint =新的油漆(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(颜色);
            mCenterPaint.setStrokeWidth(5);
        }

        私人布尔mTrackingCenter;
        私人布尔mHighlightCenter;

        @覆盖
        保护无效的OnDraw(帆布油画){
            浮动R = CENTER_X  -  mPaint.getStrokeWidth()* 0.5F;

            canvas.translate(CENTER_X,CENTER_X);

            canvas.drawOval(新RectF(-r,-r,R,R),mPaint);
            canvas.drawCircle(0,0,CENTER_RADIUS,mCenterPaint);

            如果(mTrackingCenter){
                INT C = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                如果(mHighlightCenter){
                    mCenterPaint.setAlpha(0xFF的);
                } 其他 {
                    mCenterPaint.setAlpha(0x80的);
                }
                canvas.drawCircle(0,0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(C);
            }
        }

        @覆盖
        保护无效onMeasure(INT widthMeasureSpec,诠释heightMeasureSpec){
            setMeasuredDimension(CENTER_X * 2,* CENTER_Y 2);
        }

        私有静态最终诠释CENTER_X = 100;
        私有静态最终诠释CENTER_Y = 100;
        私有静态最终诠释CENTER_RADIUS = 32;

        私人诠释floatToByte(浮点X){
            INT N = java.lang.Math.round(X);
            返回N;
        }
        私人诠释pinToByte(INT N){
            如果(正℃,){
                N = 0;
            }否则如果(N> 255){
                N = 255;
            }
            返回N;
        }

        私人诠释AVE(int类型,INT研发,浮动P){
            返回S + java.lang.Math.round(P *(D  -  S));
        }

        私人诠释interpColor(INT颜色[],浮点单元){
            如果(单元其中; = 0){
                返回颜色[0];
            }
            如果(部> = 1){
                返回颜色[colors.length  -  1];
            }

            浮动P =单位*(colors.length  -  1);
            INT I =(INT)P;
            对 -  =我;

            //现在p是刚刚小数部分[0 ... 1),i是索引
            INT C0 =颜色[I]
            INT C1 =颜色[I + 1];
            int的一个= AVE(Color.alpha(C0),Color.alpha(C1)中,p);
            INT R = AVE(Color.red(C0),Color.red(C1)中,p);
            INT克= AVE(Color.green(C0),Color.green(C1)中,p);
            INT B = AVE(Color.blue(C0),Color.blue(C1)中,p);

            返回Color.argb(A,R,G,B);
        }

        私人诠释rotateColor(INT色,浮RAD){
            浮度=弧度* 180 / 3.1415927f;
            INT R = Color.red(彩色);
            INT G = Color.green(彩色);
            INT B = Color.blue(彩色);

            嘉洛斯厘米=新嘉洛斯();
            嘉洛斯TMP =新嘉洛斯();

            cm.setRGB2YUV();
            tmp.setRotate(0,度);
            cm.postConcat(TMP);
            tmp.setYUV2RGB();
            cm.postConcat(TMP);

            最终浮动[] A = cm.getArray();

            INT IR = floatToByte(一个[0] * R + A [1] * G +一个[2] * b)条;
            INT IG = floatToByte(一个[5] * R + A [6] * G + A [7] * b)条;
            INT IB = floatToByte(一个[10] * R + A [11] * G + A [12] * b)条;

            返回Color.argb(Color.alpha(颜色),pinToByte(IR),
                              pinToByte(IG),pinToByte(IB));
        }

        私有静态最终浮动PI = 3.1415926f;

        @覆盖
        公共布尔的onTouchEvent(MotionEvent事件){
            浮X = event.getX() -  CENTER_X;
            浮动Y = event.getY() -  CENTER_Y;
            布尔内心= java.lang.Math.sqrt(X * X + Y * Y)< = CENTER_RADIUS;

            开关(event.getAction()){
                案例MotionEvent.ACTION_DOWN:
                    mTrackingCenter =内心;
                    如果(内心){
                        mHighlightCenter =真;
                        无效();
                        打破;
                    }
                案例MotionEvent.ACTION_MOVE:
                    如果(mTrackingCenter){
                        如果(mHighlightCenter!=内心){
                            mHighlightCenter =内心;
                            无效();
                        }
                    } 其他 {
                        浮动角=(浮点)java.lang.Math.atan2(Y,X);
                        //需要打开的角度[-PI ... PI]为单位[0 .... 1]
                        浮单位=角/(2 * PI);
                        如果(单位℃,){
                            单元+ = 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors,股吧));
                        无效();
                    }
                    打破;
                案例MotionEvent.ACTION_UP:
                    如果(mTrackingCenter){
                        如果(内心){
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = FALSE; //所以我们得出的w / o晕
                        无效();
                    }
                    打破;
            }
            返回true;
        }
    }

    公共ColorPickerDialog(上下文的背景下,
                             OnColorChangedListener监听器,
                             INT initialColor){
        超(上下文);

        mListener =侦听器;
        mInitialColor = initialColor;
    }

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        OnColorChangedListener L =新OnColorChangedListener(){
            公共无效colorChanged(INT颜色){
                mListener.colorChanged(颜色);
                解雇();
            }
        };

        的setContentView(新ColorPickerView(的getContext(),升,mInitialColor));
        的setTitle(选择颜色);
    }
}
 

I want to change color on button click by passing color integer as a parameter but on click the android throws an error of Null Pointer Exception. and application crashes .. i am stuck here kindly help me please function name is SetColor()

   MyView Class

  public class MyView extends Activity {

   Button brushLarge;
   Button brushMeduim;
   Button brushSmall;
   Button erase;
   Button save;
   Button trash;
   Button rainbow;
   Button color1;
    Button color2;
        Button color3;
     this.color1 = ((Button)findViewById(R.id.color1));
     this.color2 = ((Button)findViewById(R.id.color2));
     this.color3 = ((Button)findViewById(R.id.color3));
      this.color1.setOnClickListener(new View.OnClickListener()
      {
        public void onClick(View paramView)
        {
     Toast.makeText(getApplicationContext(), "color1", Toast.LENGTH_LONG).show();
          //MyView.this.coloringView.setColor("#CD5C5C");
        }
      });
      this.color2.setOnClickListener(new View.OnClickListener()
      {
        public void onClick(View paramView)
        {
            //DrawView.changePaintColor(0xFFFF0000);0);
            try
            {coloringView.changePaintColor(0xFFFF0000); 
            }
            catch(Exception e)
            {
  Toast.makeText(getApplicationContext(), "color1"+e,Toast.LENGTH_LONG).show();
            } 
            //coloringView.changePaintColor(0xFFFF0000);    
        }
      });
      this.color3.setOnClickListener(new View.OnClickListener()
      {
        public void onClick(View paramView)
        {
          MyView.this.coloringView.setColor("#FA8072");
        }
      });
      return;
    }
}

  DrawView Class    

    public class DrawView extends View {
    private Paint paint = new Paint();
    private Path path = new Path();
    private Paint circlePaint = new Paint();
    private Path circlePath = new Path();
    Canvas mCanvas;
    String color = "#ffee22";


      public DrawView(Context context, AttributeSet attrs) {
            super(context, attrs);

        paint.setAntiAlias(true);
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeWidth(15f);

        circlePaint.setAntiAlias(true);
        circlePaint.setColor(Color.BLUE);
        circlePaint.setStyle(Paint.Style.STROKE);
        circlePaint.setStrokeJoin(Paint.Join.MITER);
        circlePaint.setStrokeWidth(4f);
mCanvas=new Canvas();
    }
       public void changePaintColor(int color){
            this.paint.setColor(color);
        }

    @Override
    protected void onDraw(Canvas canvas) {

        canvas.drawPath(path, paint);
        canvas.drawPath(circlePath, circlePaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        // Gives you x and y coordinates on the Event.
        float pointX = event.getX();
        float pointY = event.getY();

        // Checks for the event that occurs
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            path.moveTo(pointX, pointY);

            return true;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(pointX, pointY);
            circlePath.reset();

            // (circle's center x-coordinate, y-coordinate, radius of the
            // circle, direction to wind the shape)
            circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW);
            //circlePath.addRect(pointX - 25, pointY - 25, pointX + 25, pointY + 25, Path.Direction.CW);
/*          RectF rect = new RectF(pointX - 25, pointY - 25, pointX + 25, pointY + 25);
            circlePath.addRoundRect(rect, 0, 0, Path.Direction.CW);
*/
            break;

        case MotionEvent.ACTION_UP:
            circlePath.reset();

            break;
        default:
            return false;
        }

        // Schedules a repaint.
        // Force a view to draw.
        postInvalidate();
        return true;
    }
/////function------------------------------------
    public void apple()
    {
    //  paint.setColor(ap);
        //Toast.makeText(getContext(), "Rehman", Toast.LENGTH_SHORT).show();
        this.paint.setColor(0xFF0000FF);


    }


    public void setColor(String color)
    {


        this.paint.setColor(0xFF0000FF);    
    }
    public void onSizeChange(int paramInt)
      {
       paint.setStrokeWidth(paramInt);
      }
      public void clear()
      {
        if (this.mCanvas != null)
        {
          this.paint.setARGB(255, 255, 255, 255);
          mCanvas.drawPaint(this.paint);
          invalidate();
          paint.setColor(Color.parseColor(this.color));
        }
      }

}

解决方案

You need to override onCreate

   @Override
   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.color1 = ((Button)findViewById(R.id.color1));
    this.color2 = ((Button)findViewById(R.id.color2));
    this.color3 = ((Button)findViewById(R.id.color3));
    ...//rest of the code
    }

You need to set the content of your layout the activity first and then intialize views.

Also you need to add your drawing view to your layout.

In onCreate

     LinearLayout ll = (LinearLayout)findViewById(R.layout.linearlayout);
     // Assuming you have linear layout in your xml add your drawing view to lineasrlayout
     // you can have relative layout also
     DrawingView view = new DrawingView(this);
     ll.addView(View);

Edit

public class MainActivity extends Activity
        implements ColorPickerDialog.OnColorChangedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));
      //circlePaint = new Paint();
        //circlePath = new Path();
        //circlePaint.setAntiAlias(true);
        //circlePaint.setColor(Color.BLUE);
        //circlePaint.setStyle(Paint.Style.STROKE);
        //circlePaint.setStrokeJoin(Paint.Join.MITER);
        //circlePaint.setStrokeWidth(4f); 
        //circlePath.reset();
        //circlePath.addCircle(mX, mY, 30, Path.Direction.CW);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(0xFFFF0000);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth(12);

        mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 },
                                       0.4f, 6, 3.5f);

        mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL);
    }

    private Paint       mPaint;
    private MaskFilter  mEmboss;
    private MaskFilter  mBlur;

    public void colorChanged(int color) {
        mPaint.setColor(color);
    }

    public class MyView extends View {

        private static final float MINP = 0.25f;
        private static final float MAXP = 0.75f;

        private Bitmap  mBitmap;
        private Canvas  mCanvas;
        private Path    mPath,circlePath;
        private Paint   mBitmapPaint,circlePaint;

        public MyView(Context c) {
            super(c);
            circlePaint = new Paint();
            circlePath = new Path();
            circlePaint.setAntiAlias(true);
            circlePaint.setColor(Color.BLUE);
            circlePaint.setStyle(Paint.Style.STROKE);
            circlePaint.setStrokeJoin(Paint.Join.MITER);
            circlePaint.setStrokeWidth(4f); 

            mPath = new Path();
            mBitmapPaint = new Paint(Paint.DITHER_FLAG);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            mCanvas = new Canvas(mBitmap);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFAAAAAA);

            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

            canvas.drawPath(mPath, mPaint);
            canvas.drawPath(circlePath, circlePaint);
        }

        private float mX, mY;
        private static final float TOUCH_TOLERANCE = 4;

        private void touch_start(float x, float y) {
            mPath.reset();
            mPath.moveTo(x, y);
            mX = x;
            mY = y;
        }
        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) {
                mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
                mX = x;
                mY = y;
            }
            circlePath.reset();
            circlePath.addCircle(mX, mY, 30, Path.Direction.CW);
        }
        private void touch_up() {
            mPath.lineTo(mX, mY);
            // commit the path to our offscreen
            mCanvas.drawPath(mPath, mPaint);
            // kill this so we don't double draw
            circlePath.reset();
            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;
        }
    }

    private static final int COLOR_MENU_ID = Menu.FIRST;
    private static final int EMBOSS_MENU_ID = Menu.FIRST + 1;
    private static final int BLUR_MENU_ID = Menu.FIRST + 2;
    private static final int ERASE_MENU_ID = Menu.FIRST + 3;
    private static final int SRCATOP_MENU_ID = Menu.FIRST + 4;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('3', 'c');
        menu.add(0, EMBOSS_MENU_ID, 0, "Emboss").setShortcut('4', 's');
        menu.add(0, BLUR_MENU_ID, 0, "Blur").setShortcut('5', 'z');
        menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('5', 'z');
        menu.add(0, SRCATOP_MENU_ID, 0, "SrcATop").setShortcut('5', 'z');

        /****   Is this the mechanism to extend with filter effects?
        Intent intent = new Intent(null, getIntent().getData());
        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
        menu.addIntentOptions(
                              Menu.ALTERNATIVE, 0,
                              new ComponentName(this, NotesList.class),
                              null, intent, 0, null);
        *****/
        return true;
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xFF);

        switch (item.getItemId()) {
            case COLOR_MENU_ID:
                new ColorPickerDialog(this, this, mPaint.getColor()).show();
                return true;
            case EMBOSS_MENU_ID:
                if (mPaint.getMaskFilter() != mEmboss) {
                    mPaint.setMaskFilter(mEmboss);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case BLUR_MENU_ID:
                if (mPaint.getMaskFilter() != mBlur) {
                    mPaint.setMaskFilter(mBlur);
                } else {
                    mPaint.setMaskFilter(null);
                }
                return true;
            case ERASE_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                        PorterDuff.Mode.CLEAR));
                return true;
            case SRCATOP_MENU_ID:
                mPaint.setXfermode(new PorterDuffXfermode(
                                                    PorterDuff.Mode.SRC_ATOP));
                mPaint.setAlpha(0x80);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

ColorPickerDialog

public class ColorPickerDialog extends Dialog {

    public interface OnColorChangedListener {
        void colorChanged(int color);
    }

    private OnColorChangedListener mListener;
    private int mInitialColor;

    private static class ColorPickerView extends View {
        private Paint mPaint;
        private Paint mCenterPaint;
        private final int[] mColors;
        private OnColorChangedListener mListener;

        ColorPickerView(Context c, OnColorChangedListener l, int color) {
            super(c);
            mListener = l;
            mColors = new int[] {
                0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
                0xFFFFFF00, 0xFFFF0000
            };
            Shader s = new SweepGradient(0, 0, mColors, null);

            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(s);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);

            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(color);
            mCenterPaint.setStrokeWidth(5);
        }

        private boolean mTrackingCenter;
        private boolean mHighlightCenter;

        @Override
        protected void onDraw(Canvas canvas) {
            float r = CENTER_X - mPaint.getStrokeWidth()*0.5f;

            canvas.translate(CENTER_X, CENTER_X);

            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
            canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);

            if (mTrackingCenter) {
                int c = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);

                if (mHighlightCenter) {
                    mCenterPaint.setAlpha(0xFF);
                } else {
                    mCenterPaint.setAlpha(0x80);
                }
                canvas.drawCircle(0, 0,
                                  CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
                                  mCenterPaint);

                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(c);
            }
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(CENTER_X*2, CENTER_Y*2);
        }

        private static final int CENTER_X = 100;
        private static final int CENTER_Y = 100;
        private static final int CENTER_RADIUS = 32;

        private int floatToByte(float x) {
            int n = java.lang.Math.round(x);
            return n;
        }
        private int pinToByte(int n) {
            if (n < 0) {
                n = 0;
            } else if (n > 255) {
                n = 255;
            }
            return n;
        }

        private int ave(int s, int d, float p) {
            return s + java.lang.Math.round(p * (d - s));
        }

        private int interpColor(int colors[], float unit) {
            if (unit <= 0) {
                return colors[0];
            }
            if (unit >= 1) {
                return colors[colors.length - 1];
            }

            float p = unit * (colors.length - 1);
            int i = (int)p;
            p -= i;

            // now p is just the fractional part [0...1) and i is the index
            int c0 = colors[i];
            int c1 = colors[i+1];
            int a = ave(Color.alpha(c0), Color.alpha(c1), p);
            int r = ave(Color.red(c0), Color.red(c1), p);
            int g = ave(Color.green(c0), Color.green(c1), p);
            int b = ave(Color.blue(c0), Color.blue(c1), p);

            return Color.argb(a, r, g, b);
        }

        private int rotateColor(int color, float rad) {
            float deg = rad * 180 / 3.1415927f;
            int r = Color.red(color);
            int g = Color.green(color);
            int b = Color.blue(color);

            ColorMatrix cm = new ColorMatrix();
            ColorMatrix tmp = new ColorMatrix();

            cm.setRGB2YUV();
            tmp.setRotate(0, deg);
            cm.postConcat(tmp);
            tmp.setYUV2RGB();
            cm.postConcat(tmp);

            final float[] a = cm.getArray();

            int ir = floatToByte(a[0] * r +  a[1] * g +  a[2] * b);
            int ig = floatToByte(a[5] * r +  a[6] * g +  a[7] * b);
            int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);

            return Color.argb(Color.alpha(color), pinToByte(ir),
                              pinToByte(ig), pinToByte(ib));
        }

        private static final float PI = 3.1415926f;

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX() - CENTER_X;
            float y = event.getY() - CENTER_Y;
            boolean inCenter = java.lang.Math.sqrt(x*x + y*y) <= CENTER_RADIUS;

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mTrackingCenter = inCenter;
                    if (inCenter) {
                        mHighlightCenter = true;
                        invalidate();
                        break;
                    }
                case MotionEvent.ACTION_MOVE:
                    if (mTrackingCenter) {
                        if (mHighlightCenter != inCenter) {
                            mHighlightCenter = inCenter;
                            invalidate();
                        }
                    } else {
                        float angle = (float)java.lang.Math.atan2(y, x);
                        // need to turn angle [-PI ... PI] into unit [0....1]
                        float unit = angle/(2*PI);
                        if (unit < 0) {
                            unit += 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors, unit));
                        invalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    if (mTrackingCenter) {
                        if (inCenter) {
                            mListener.colorChanged(mCenterPaint.getColor());
                        }
                        mTrackingCenter = false;    // so we draw w/o halo
                        invalidate();
                    }
                    break;
            }
            return true;
        }
    }

    public ColorPickerDialog(Context context,
                             OnColorChangedListener listener,
                             int initialColor) {
        super(context);

        mListener = listener;
        mInitialColor = initialColor;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        OnColorChangedListener l = new OnColorChangedListener() {
            public void colorChanged(int color) {
                mListener.colorChanged(color);
                dismiss();
            }
        };

        setContentView(new ColorPickerView(getContext(), l, mInitialColor));
        setTitle("Pick a Color");
    }
}

这篇关于主叫功能的Andr​​oid零异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆