使用SurfaceView在Android中自定义视图

使用SurfaceView在Android中自定义视图,android,android-custom-view,Android,Android Custom View,我正在尝试创建自定义视图,该视图按特定颜色填充和清空,但它不起作用。我不熟悉以编程方式创建自定义视图,所以如果有一些“常识”错误 代码: 公共类PitchView扩展了SurfaceView,实现了SurfaceHolder.Callback{ private int width, height; private final Paint paint = new Paint(); private int cx; private int cy; public PitchView(Context c

我正在尝试创建自定义视图,该视图按特定颜色填充和清空,但它不起作用。我不熟悉以编程方式创建自定义视图,所以如果有一些“常识”错误

代码:

公共类PitchView扩展了SurfaceView,实现了SurfaceHolder.Callback{

private int width, height;
private final Paint paint = new Paint();
private int cx;
private int cy;

public PitchView(Context context) {
    super(context);
}

public PitchView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public PitchView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // TODO Auto-generated method stub
    width = MeasureSpec.getSize(widthMeasureSpec);
    height = MeasureSpec.getSize(heightMeasureSpec);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    cx = 0;
    cy = 0;
}

@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) {
    paint.setStrokeWidth((float) width);
    paint.setColor(Color.WHITE);
    canvas.drawLine(0, 0, width, height, paint);
    paint.setColor(Color.BLUE);
    canvas.drawLine(0, 0, cx, cy, paint);
}

Thread t = new Thread(new Runnable() {

    private boolean moveUp = true;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            while (true) {
                if (cx >= width) {
                    moveUp = false;
                } else if (cx <= 0) {
                    moveUp = true;
                }
                if (moveUp)
                    cy++;
                else
                    cy--;
                Thread.sleep(500);
                postInvalidate();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.e("PitchView Error", e.getMessage(), e);
        }
    }
});

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    t.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    t.interrupt();
}
private int宽度、高度;
私人最终油漆=新油漆();
私人int cx;
私密性;
公共视图(上下文){
超级(上下文);
}
公共PitchView(上下文、属性集属性){
超级(上下文,attrs);
}
公共PitchView(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
@凌驾
测量时的保护空隙(内部宽度测量等级、内部高度测量等级){
//TODO自动生成的方法存根
宽度=MeasureSpec.getSize(widthMeasureSpec);
高度=测量等级getSize(高度测量等级);
超级测量(宽度测量、高度测量);
cx=0;
cy=0;
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
宽度=w;
高度=h;
}
@凌驾
受保护的void onDraw(画布){
油漆。设置行程宽度((浮动)宽度);
油漆。设置颜色(颜色。白色);
帆布。抽绳(0,0,宽度,高度,油漆);
油漆。设置颜色(颜色。蓝色);
帆布.抽绳(0,0,cx,cy,油漆);
}
线程t=新线程(新的可运行线程(){
私有布尔值moveUp=true;
@凌驾
公开募捐{
//TODO自动生成的方法存根
试一试{
while(true){
如果(cx>=宽度){
moveUp=false;

}否则,如果(cx您不需要重写onDraw方法,那么所有绘图代码都可以写入线程,因此您可以在不中断主线程的情况下绘制复杂的图形。 SurfaceView是视图的一个特殊子类,它在视图层次结构中提供一个专用的绘图面。其目的是将此绘图面提供给应用程序的次线程,这样应用程序就不需要等待系统的视图层次结构准备好绘图。相反,它是一个引用surface的次线程eView可以以自己的速度绘制到自己的画布上

Thread t = new Thread(new Runnable() {

private boolean moveUp = true;

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        while (true) {
            if (cx >= width) {
                moveUp = false;
            } else if (cx <= 0) {
                moveUp = true;
            }
            if (moveUp)
                cy++;
            else
                cy--;
                //Here you can draw graphics
                Canvas canvas = surfaceHolder.lockCanvas();
                paint.setStrokeWidth((float) width);
                paint.setColor(Color.WHITE);
                canvas.drawLine(0, 0, width, height, paint);
                paint.setColor(Color.BLUE);
                canvas.drawLine(0, 0, cx, cy, paint);
                surfaceHolder.unlockCanvasAndPost(canvas);
            Thread.sleep(500);
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.e("PitchView Error", e.getMessage(), e);
    }
}

感谢您的回复。我们如何将surfaceHolder传递给线程对象t?它在surfaceHolder上给了我错误。感谢它的工作。我还错过了构造函数中的getHolder().addCallback(此);语句。
private SurfaceHolder surfaceHolder = null;

@Override
public void surfaceCreated(SurfaceHolder holder) {
    surfaceHolder = holder;
    t.start();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int frmt, int w, int h) {
    surfaceHolder = holder;
}