使用SurfaceView在Android中自定义视图
我正在尝试创建自定义视图,该视图按特定颜色填充和清空,但它不起作用。我不熟悉以编程方式创建自定义视图,所以如果有一些“常识”错误 代码: 公共类PitchView扩展了SurfaceView,实现了SurfaceHolder.Callback{使用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
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;
}