zoukankan      html  css  js  c++  java
  • layout可以显示,程序调用就出错

    ============问题描述============


    我用网上的ColorPickerDialog控件改成了View控件,希望把ColorPicker控件直接嵌入到layout内,在layout设计界面可以看到View已经显示了,但在MainActivity内使用SetContentView调用后就报错,请大侠帮我查下哪里写得不对;

    
    package com.example.colorpicker;
    
    
    
    import android.content.Context;
    
    import android.graphics.Canvas;
    
    import android.graphics.Color;
    
    import android.graphics.LinearGradient;
    
    import android.graphics.Paint;
    
    import android.graphics.RectF;
    
    import android.graphics.Shader;
    
    import android.graphics.SweepGradient;
    
    import android.view.View;
    
    
    
    
    
    public class ColorPickerView extends View {
    
    	private Paint mPaint;//
    
    	private Paint mCenterPaint;//
    
    	private Paint mLinePaint;//
    
    	private Paint mRectPaint;//
    
    	
    
    	private Shader rectShader;//
    
    	private float rectLeft;//
    
    	private float rectTop;//
    
    	private float rectRight;//
    
    	private float rectBottom;//
    
    	private final boolean debug = true;
    
    	private final String TAG = "ColorPicker";
    
    	
    
    	Context context;
    
    	private String title;//
    
    	private int mInitialColor;//
    
    //    private OnColorChangedListener mListener;
    
    
    
    	private final int[] mCircleColors;//
    
    	private final int[] mRectColors;//
    
    	
    
    	private int mHeight;//
    
    	private int mWidth;//
    
    	private float r;//
    
    	private float centerRadius;//
    
    	
    
    	private boolean downInCircle = true;//
    
    	private boolean downInRect;//
    
    	private boolean highlightCenter;//
    
    	private boolean highlightCenterLittle;//
    
    	
    
    //	public ColorPickerView(Context context, int height, int width) {
    
    	public ColorPickerView(Context context) {
    
    		super(context);
    
    		int height = 400;
    
    		int width = 500;
    
    		this.mHeight = height - 36;
    
    		this.mWidth = width;
    
    		setMinimumHeight(height - 36);
    
    		setMinimumWidth(width);
    
    		
    
        	mCircleColors = new int[] {0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 
    
        			0xFF00FFFF, 0xFF00FF00,0xFFFFFF00, 0xFFFF0000};
    
        	Shader s = new SweepGradient(0, 0, mCircleColors, null);
    
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    
            mPaint.setShader(s);
    
            mPaint.setStyle(Paint.Style.STROKE);
    
            mPaint.setStrokeWidth(50);
    
            r = width / 2 * 0.7f - mPaint.getStrokeWidth() * 0.5f;
    
            
    
        
    
            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    
            mCenterPaint.setColor(mInitialColor);
    
            mCenterPaint.setStrokeWidth(5);
    
            centerRadius = (r - mPaint.getStrokeWidth() / 2 ) * 0.7f;
    
            
    
    
    
            mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    
            mLinePaint.setColor(Color.parseColor("#72A1D1"));
    
            mLinePaint.setStrokeWidth(4);
    
            
    
    
    
            mRectColors = new int[]{0xFF000000, mCenterPaint.getColor(), 0xFFFFFFFF};
    
            mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    
            mRectPaint.setStrokeWidth(5);
    
            rectLeft = -r - mPaint.getStrokeWidth() * 0.5f;
    
            rectTop = r + mPaint.getStrokeWidth() * 0.5f + 
    
            		mLinePaint.getStrokeMiter() * 0.5f + 15;
    
            rectRight = r + mPaint.getStrokeWidth() * 0.5f;
    
            rectBottom = rectTop + 50;
    
    	}
    
    
    
    	private void init()
    
    	{
    
    		
    
    	}
    
    	@Override
    
    	protected void onDraw(Canvas canvas) {
    
    
    
            canvas.translate(mWidth / 2, mHeight / 2 - 50);
    
    
    
            canvas.drawCircle(0, 0, centerRadius,  mCenterPaint);
    
    
    
            if (highlightCenter || highlightCenterLittle) {
    
                int c = mCenterPaint.getColor();
    
                mCenterPaint.setStyle(Paint.Style.STROKE);
    
                if(highlightCenter) {
    
                	mCenterPaint.setAlpha(0xFF);
    
                }else if(highlightCenterLittle) {
    
                	mCenterPaint.setAlpha(0x90);
    
                }
    
                canvas.drawCircle(0, 0, 
    
                		centerRadius + mCenterPaint.getStrokeWidth(),  mCenterPaint);
    
                
    
                mCenterPaint.setStyle(Paint.Style.FILL);
    
                mCenterPaint.setColor(c);
    
            }
    
    
    
            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
    
    
    
            if(downInCircle) {
    
            	mRectColors[1] = mCenterPaint.getColor();
    
            }
    
            rectShader = new LinearGradient(rectLeft, 0, rectRight, 0, mRectColors, null, Shader.TileMode.MIRROR);
    
            mRectPaint.setShader(rectShader);
    
            canvas.drawRect(rectLeft, rectTop, rectRight, rectBottom, mRectPaint);
    
            float offset = mLinePaint.getStrokeWidth() / 2;
    
            canvas.drawLine(rectLeft - offset, rectTop - offset * 2, 
    
            		rectLeft - offset, rectBottom + offset * 2, mLinePaint);//?·|
    
            canvas.drawLine(rectLeft - offset * 2, rectTop - offset, 
    
            		rectRight + offset * 2, rectTop - offset, mLinePaint);//???
    
            canvas.drawLine(rectRight + offset, rectTop - offset * 2, 
    
            		rectRight + offset, rectBottom + offset * 2, mLinePaint);//??3
    
            canvas.drawLine(rectLeft - offset * 2, rectBottom + offset, 
    
            		rectRight + offset * 2, rectBottom + offset, mLinePaint);//???
    
    		super.onDraw(canvas);
    
    	}
    
    	
    
    
    
    	@Override
    
    	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
    		super.onMeasure(mWidth, mHeight);
    
    	}
    
    
    
    
    
    	private boolean inColorCircle(float x, float y, float outRadius, float inRadius) {
    
    		double outCircle = Math.PI * outRadius * outRadius;
    
    		double inCircle = Math.PI * inRadius * inRadius;
    
    		double fingerCircle = Math.PI * (x * x + y * y);
    
    		if(fingerCircle < outCircle && fingerCircle > inCircle) {
    
    			return true;
    
    		}else {
    
    			return false;
    
    		}
    
    	}
    
    	
    
    
    
    	private boolean inCenter(float x, float y, float centerRadius) {
    
    		double centerCircle = Math.PI * centerRadius * centerRadius;
    
    		double fingerCircle = Math.PI * (x * x + y * y);
    
    		if(fingerCircle < centerCircle) {
    
    			return true;
    
    		}else {
    
    			return false;
    
    		}
    
    	}
    
    	
    
    
    
    	private boolean inRect(float x, float y) {
    
    		if( x <= rectRight && x >=rectLeft && y <= rectBottom && y >=rectTop) {
    
    			return true;
    
    		} else {
    
    			return false;
    
    		}
    
    	}
    
    
    
    	private int interpCircleColor(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 interpRectColor(int colors[], float x) {
    
    		int a, r, g, b, c0, c1;
    
        	float p;
    
        	if (x < 0) {
    
        		c0 = colors[0]; 
    
        		c1 = colors[1];
    
        		p = (x + rectRight) / rectRight;
    
        	} else {
    
        		c0 = colors[1];
    
        		c1 = colors[2];
    
        		p = x / rectRight;
    
        	}
    
        	a = ave(Color.alpha(c0), Color.alpha(c1), p);
    
        	r = ave(Color.red(c0), Color.red(c1), p);
    
        	g = ave(Color.green(c0), Color.green(c1), p);
    
        	b = ave(Color.blue(c0), Color.blue(c1), p);
    
        	return Color.argb(a, r, g, b);
    
    	}
    
    	
    
    	private int ave(int s, int d, float p) {
    
            return s + Math.round(p * (d - s));
    
        }
    
    
    
    
    
    public String getTitle() {
    
    	return title;
    
    }
    
    
    
    public void setTitle(String title) {
    
    	this.title = title;
    
    }
    
    
    
    public int getmInitialColor() {
    
    	return mInitialColor;
    
    }
    
    
    
    public void setmInitialColor(int mInitialColor) {
    
    	this.mInitialColor = mInitialColor;
    
    }
    
    }
    
    

    ============解决方案1============


    看看错误log是什么,就知道哪里错了。

    ============解决方案2============


    你能把相应layout的XML文件贴出来么

    ============解决方案3============


    异常很明显是没有构造函数。
    public ColorPickerView(Context context, AttributeSet attributeSet)

    Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]

    ============解决方案4============


    public ColorPickerView(Context context, AttributeSet attributeSet) {  
           this.ColorPickerView(context);//这样写
    }

    ============解决方案5============


    public ColorPickerView(Context context, AttributeSet attributeSet) {  
          super(context,attributeSet);
           ColorPickerView(context);//...................................
    }

    ColorPickerView(context) 你不是说你写了这个构造函数了么。
  • 相关阅读:
    c++ 为自定义类添加stl遍历器风格的遍历方式
    C++ 生成随机数
    c/c++ 函数说明以及技巧总结
    XSLT 教程
    C# 高效过滤DataTable 中重复数据方法
    xml获取指定节点的路径
    TreeView控件
    推荐一些C#相关的网站、资源和书籍
    C#多线程操作
    C#二进制序列化
  • 原文地址:https://www.cnblogs.com/lianxu61/p/4035719.html
Copyright © 2011-2022 走看看