怎么在ListView的Item里面去用SurfaceView绘制 10C

package com.example.mysurfaceviewdemo;

import java.util.Random;

import android.graphics.Bitmap;

public class BitmapBubble {

private Bitmap mBitmap;

private int maxX;

private int maxY;

private int x;

private int y;

private boolean isRight = true;

private boolean isUp = true;

Random random = new Random();

private int speedX = random.nextInt(2)+1;

private int speedY = random.nextInt(10)+1;

public BitmapBubble(Bitmap mBitmap,int x,int y,int maxX,int maxY){
    this.mBitmap = mBitmap;
    this.x = x;
    this.y = y;
    this.maxX = maxX - mBitmap.getWidth();
    this.maxY = maxY - mBitmap.getHeight();
}

public int getMaxX() {
    return maxX;
}

public void setMaxX(int maxX) {
    this.maxX = maxX;
}

public int getMaxY() {
    return maxY;
}

public void setMaxY(int maxY) {
    this.maxY = maxY;
}

public int getX() {
    x+=speedX;
    return x;
}


public int getY() {
    y-=speedY;
    return y;
}

public void setX(int x) {
    this.x = x;
}

public void setY(int y) {
    this.y = y;
}

public int getSpeedX() {
    return speedX;
}

public void setSpeedX(int speedX) {
    this.speedX = speedX;
}

public Bitmap getmBitmap() {
    return mBitmap;
}

public void setmBitmap(Bitmap mBitmap) {
    this.mBitmap = mBitmap;
}       

}

package com.example.mysurfaceviewdemo;

import java.util.ArrayList;
import java.util.Random;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MySurfaceView extends SurfaceView implements Callback,Runnable{

private SurfaceHolder mSurfaceHolder;

private Thread mThread;

private Canvas canvas;

private int ScreenW, ScreenH; 

private Random random = new Random();

private ArrayList <BitmapBubble> list  = new ArrayList<BitmapBubble>();


int maxY;

int maxX;

int x ;

int y ;

private boolean hasBitmapBubble = true;

private Bitmap mBitmap;

private BitmapBubble mBitmapBubble;

private int BitmapIds [] = new int []{R.drawable.water,R.drawable.water2,R.drawable.water3,R.drawable.water4};

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

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

@Override
public void run(){                  
    Canvas canvas = mSurfaceHolder.lockCanvas();        
     maxX = canvas.getWidth();
     maxY = canvas.getHeight(); 
     x = 30;
     y = maxY-80;
     mSurfaceHolder.unlockCanvasAndPost(canvas);

     while(true){
        canvas = mSurfaceHolder.lockCanvas();
        if(canvas==null){
            return;
        }
        canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);
        for(int j=0; j<list.size();j++){
            mBitmapBubble = list.get(j);
            canvas.drawBitmap(mBitmapBubble.getmBitmap(),mBitmapBubble.getX(), mBitmapBubble.getY(), null);
            if(mBitmapBubble.getX()>mBitmapBubble.getMaxX()){
                list.remove(mBitmapBubble);
            }
            if(mBitmapBubble.getY()<0){
                list.remove(mBitmapBubble);
            }
        }           
            mSurfaceHolder.unlockCanvasAndPost(canvas); 
            try {
                Thread.sleep(150);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }   
}

public void initSurfaceView(Context context){       
    mSurfaceHolder = this.getHolder();
    mSurfaceHolder.addCallback(this);
    this.setZOrderOnTop(true);//设置画布  背景透明
    this.getHolder().setFormat(PixelFormat.TRANSLUCENT);    
    drawBubble();
    mThread = new Thread(this);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mThread.start();
    //生产冒泡
    new Thread(){
        public void run() {
            while(true){
                int position = random.nextInt(4);
                int resId = BitmapIds[position];
                mBitmap = BitmapFactory.decodeResource(getResources(),resId);
                Bitmap bitmap = Bitmap.createScaledBitmap(mBitmap, 50, 50, false);
                list.add(new BitmapBubble(bitmap, x, y, maxX, maxY));
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        }.start();
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {

}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    mThread.stop();
}
public ArrayList<BitmapBubble> getList() {
    return list;
}
public void setList(ArrayList<BitmapBubble> list) {
    this.list = list;
}
public void drawBubble(){
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
        Bitmap bitmap = Bitmap.createScaledBitmap(mBitmap, 40, 40, false);
        list.add(new BitmapBubble(bitmap, x, y, maxX, maxY));
}

}

package com.example.mysurfaceviewdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;

public class MyAdapter extends BaseAdapter{
Context mContext;
public MyAdapter(Context mContext){
this.mContext = mContext;
}

@Override
public int getCount() {
    return 10;
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.activity_main, null);


  final MySurfaceView mySurfaceView = (MySurfaceView)view.findViewById(R.id.mysurfaceview);      
  Button btn = (Button) view.findViewById(R.id.btn);        
  btn.setOnClickListener(new OnClickListener() {            
        @Override
        public void onClick(View v) {
            mySurfaceView.drawBubble();
        }
    });
    return view;
}

}

package com.example.mysurfaceviewdemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {
MySurfaceView mySurfaceView;
Button btn;
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
// setContentView(R.layout.activity_main);
// mySurfaceView = (MySurfaceView) findViewById(R.id.mysurfaceview);

// btn = (Button) findViewById(R.id.btn);

// btn.setOnClickListener(new OnClickListener() {

// @Override
// public void onClick(View v) {
// mySurfaceView.drawBubble();
// }
// });

listview = (ListView)findViewById(R.id.listview);
listview.setAdapter(new MyAdapter(getApplicationContext()));
}

}

求大牛教育
,为什么我在绘制的时候,它的回调不走,但是SurfaceView的宿主是Activity的时候就可以去绘

1个回答

qq_29924041
^_^ 小小码nong 我的自定义SurfaView没有问题,因为在activity的布局里面是可以绘制的,但是扔进listView的Item里面就绘制不了了
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!