0

そこで、キャンバスに三角形を描くAndroidアクティビティを作成しました。また、VMに4つのメニュー([色]、[拡大]、[縮小]、[リセット])を追加しました。色は問題なく機能しますが、メニューボタンを押した後、Androidで三角形のサイズを変更する方法がよくわかりません。割り当てでは、三角形の上の点を修正してから、下の2点の座標を変更するように指示されています。三角形。誰かがAndroidでそれを行う方法について正しい方向に私を向けることができますか?

これが私のコードですが、拡大、縮小、リセットの実装は、三角形ではなく円(以前に行ったプロジェクト)で機能するように設定されています。「カラー」メニューが機能するので、それを行う必要がないことに注意してください。

public class MainActivity extends Activity
{
    final Context context = this;
    private Graphics graphic;
    private Dialog radiusDialog; //Creates dialog box declaration
    private SeekBar red;
    private SeekBar green;
    private SeekBar blue;
    private Button radiusButton;

    private TextView progress1;
    private TextView progress2;
    private TextView progress3;
    private TextView tv;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);       
        graphic = new Graphics(this); //Create new instance of graphics view
        setContentView(graphic); //Associates customized view with current screen     
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) //This acts as a menu listener to override
    {
        switch(item.getItemId()) //returns menu item
        {
        case R.id.Color:
            showDialog();
            break;
        case R.id.Shrink:
            graphic.setRadius(graphic.getRadius() -1);
            graphic.invalidate();
            break;
        case R.id.Enlarge:
            graphic.setRadius(graphic.getRadius() +1);
            graphic.invalidate();
            break;
        case R.id.Reset:
            graphic.setColor(Color.CYAN);
            graphic.setRadius(75);
            graphic.invalidate();
            break;
        }
        return super.onOptionsItemSelected(item);
    }





    void showDialog() //creates memory for dialog
    {
        radiusDialog = new Dialog(context);
        radiusDialog.setContentView(R.layout.draw_layout);  //binds layout file (radius) with current dialog
        radiusDialog.setTitle("Select Color:");


        red = (SeekBar)radiusDialog.findViewById(R.id.seekBar1);
        green = (SeekBar)radiusDialog.findViewById(R.id.seekBar2);
        blue = (SeekBar)radiusDialog.findViewById(R.id.seekBar3);

        progress1 = (TextView)radiusDialog.findViewById(R.id.textView2);
        progress2 = (TextView)radiusDialog.findViewById(R.id.textView4);
        progress3 = (TextView)radiusDialog.findViewById(R.id.textView6);    

        mychange redC = new mychange();
        red.setOnSeekBarChangeListener(redC);

        mychange greenC = new mychange();
        green.setOnSeekBarChangeListener(greenC);

        tv = (TextView)radiusDialog.findViewById(R.id.textView7);
        mychange c = new mychange();
        blue.setOnSeekBarChangeListener(c);     
        radiusButton = (Button) radiusDialog.findViewById(R.id.button1);
        radiusButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                int color = Color.rgb(red.getProgress(), green.getProgress(), blue.getProgress());  
                radiusDialog.dismiss();
                setContentView(R.layout.activity_main);
                setContentView(graphic);
                graphic.setColor(color);//Create new instance of graphics view
                graphic.invalidate();
            }
        });
        radiusDialog.show(); //shows dialog on screen
    } 

    public class mychange implements OnSeekBarChangeListener{

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            // TODO Auto-generated method stub
            int color = Color.rgb(red.getProgress(), green.getProgress(), blue.getProgress());  
            tv.setBackgroundColor(color);
            progress1.setText(String.valueOf(red.getProgress()));
            progress2.setText(String.valueOf(green.getProgress()));
            progress3.setText(String.valueOf(blue.getProgress()));

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }
    }

}

三角形を描くグラフィックスクラス

public class Graphics extends View 
{

    private Paint paint;
    private int radius;
    private int color;

    public void setColor(int color)
    {
        this.color = color;
    }

    public Graphics(Context context) //creates custom view (constructor)
    {
        super(context);
        paint = new Paint(); //create instance of paint
        color = Color.CYAN;
        paint.setStyle(Paint.Style.FILL); //draw filled shape
        radius = 75;
    }

    @Override
    protected void onDraw(Canvas canvas) //override onDraw method
    {
        super.onDraw(canvas);
        paint.setColor(color);  
        paint.setStyle(Paint.Style.STROKE);
        Path path = new Path();
        path.moveTo(230, 200);
        path.lineTo(330, 300);
        path.lineTo(130, 300);
        path.close();
        canvas.drawPath(path, paint);
    }

    void setRadius(int radius)
    {
        this.radius = radius;
        invalidate(); //just like repaint method
    }
    public int getRadius()
    {
        return radius;
    }   
}
4

1 に答える 1

0

上部の座標が固定されたままの場合は、三角形の高さを変更して縮小/拡大できます。

三角形が正三角形であるとしましょう-3つの辺すべてが同じ長さです。この場合:

ここに画像の説明を入力してください

したがって、上部の頂点座標が(x、y)の場合、下部の座標は次のようになります。

(x - side / 2, y + h)

と:

(x + side / 2, y + h)

したがって、パスコードは次のように記述する必要があります。

float side = Math.sqrt(3) / 2 * height;
Path path = new Path();
path.moveTo(x, y);
path.lineTo(x - side / 2, y + height);
path.lineTo(x + side / 2, y + height);
path.close();
于 2012-12-07T23:40:24.420 に答える