0

因此,我创建了一个在画布上绘制三角形的 android 活动。我还在 VM 中添加了 4 个菜单(颜色、放大、缩小和重置)。颜色工作正常,但我不太确定一旦按下该菜单按钮后如何在 android 中调整三角形的大小。分配说只是固定三角形的顶点,然后更改底部两点的坐标三角形。谁能指出我在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 回答