0

ImageViews (64) の 2 次元配列を持つゲームがあります。これは効率的なコードではなく、スクロールの問題もあると思います(水平または垂直にしか自由に移動できません)。Minesweeper Classic のようなものが欲しいです。

https://www.youtube.com/watch?v=6n5FOdgDmI0&feature=player_embedded

セルを配置するには、どのような種類のウィジェットを使用する必要がありますか? 多分GridView?私は gridview と tablelayout を試していますが、スクロールの自由にはまだ問題があります。

ありがとう。

4

1 に答える 1

0

私は onTouchListener と

    gridview.setOnTouchListener(new OnTouchListener() { 
        public boolean onTouch(View v, MotionEvent event) {
            int desplazamiento[]={0,0};
            campo.getLocationOnScreen(desplazamiento);
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mx = event.getX();
                    my = event.getY();
                    return false;
                case MotionEvent.ACTION_MOVE:
                    curX = event.getX();
                    curY = event.getY();
                    campo.scrollBy((int) (mx - curX), (int) (my - curY));                 
                    mx = curX;
                    my = curY;
                    return false;
                case MotionEvent.ACTION_UP:
                    curX = event.getX();
                    curY = event.getY();
                    campo.scrollBy((int) (mx - curX), (int) (my - curY));
                    return false;
            }
            return false;
        }
    });

    zoom.setOnZoomInClickListener(new OnClickListener() {       
        public void onClick(View v) {
            adaptador.incZoom(fondo, gridview);
            gridview.setAdapter(adaptador);     
        }
    });

    zoom.setOnZoomOutClickListener(new OnClickListener() {          
        public void onClick(View v) {
            adaptador.decZoom(fondo, gridview);
            gridview.setAdapter(adaptador); 
        }
    });
}

BaseAdapter を拡張して、ズーム用に 2 つのメソッドを配置します。

public class ImageAdapter extends BaseAdapter {

public ImageAdapter(Context context) {
    mContext = context;
    metrics = mContext.getResources().getDisplayMetrics();
    float dp = 80f;
    float fpixels = metrics.density * dp;
    CUADRO = (int) (metrics.density * dp + 0.5f);
}

public int getCount() {
    return 64;
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}

// create a new ImageView for each item referenced by the Adapter
@SuppressLint("NewApi")
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {  // if it's not recycled, initialize some attributes         
        imagen = new ImageView(mContext);
        imagen.setLayoutParams(new GridView.LayoutParams(CUADRO, CUADRO));
        imagen.setScaleType(ImageView.ScaleType.FIT_XY);
        imagen.setPadding(0, 0, 0, 0);
    } else {
        imagen = (ImageView) convertView;
    }
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        imagen.setBackground(drawables[position]);

    } else {
        imagen.setBackgroundDrawable(drawables[position]);         
    }
    imagen.setImageResource(agua[position]);
    return imagen;
} 

public void incZoom(ImageView fondo, GridView terreno) {
    int incremento = CUADRO*10/100;
    CUADRO = CUADRO+incremento; 
    terreno.getLayoutParams().height=8*CUADRO;
    terreno.getLayoutParams().width=8*CUADRO;
    fondo.getLayoutParams().height=fondo.getHeight()*110/100;
    fondo.getLayoutParams().width=fondo.getWidth()*110/100; 
}

public void decZoom(ImageView fondo, GridView terreno) {
    int incremento = - CUADRO*10/100;
    CUADRO = CUADRO+incremento;
    terreno.getLayoutParams().height=8*CUADRO;
    terreno.getLayoutParams().width=8*CUADRO;
    fondo.getLayoutParams().height=fondo.getHeight()*90/100;
    fondo.getLayoutParams().width=fondo.getWidth()*90/100;
}

}

于 2012-09-22T17:51:31.157 に答える