簡體   English   中英

有沒有一種方法可以在運行時創建的Android中制作異形按鈕?

[英]Is there a way to make shaped buttons in Android that you create in run time?

我們正在創建一個應用程序,您可以在運行時創建帶有形狀的按鈕來映射圖像,例如: http ://www.outsharked.com/imagemapster/default.aspx?demos.html#vegetables我們嘗試使用Android Paths,但您可以不能使路徑消失或改變顏色。

你有想法嗎?

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Botones btn = new Botones(this);

        setContentView(btn);

    }

    private class Botones extends View {

        ArrayList<Path> paths = new ArrayList<Path>();
        ArrayList<Paint> paints = new ArrayList<Paint>();

        public Botones(Context context) {
            super(context);
        }
        public Paint paintn;
        public Paint paintb;
        public Canvas canvasg;
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvasg = canvas;
            paintn = new Paint();
            paintn.setColor(getColor(R.color.colorAccent));
            paintn.setStyle(Paint.Style.STROKE);
            paintn.setStrokeWidth(8);
            paintn.setStyle(Paint.Style.FILL);
            paints.add(paintn);

            paintb = new Paint();
            paintb.setColor(getColor(R.color.linea));
            paintb.setStyle(Paint.Style.STROKE);
            paintb.setStrokeWidth(8);
            paintb.setStyle(Paint.Style.FILL);
            paints.add(paintb);



            coordenadas(canvas);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {

            float x;
            float y;
            x = event.getX();
            y = event.getY();

            for (Path p : paths){
                RectF pBounds=new RectF();
                p.computeBounds(pBounds,true);
                if (pBounds.contains(x,y)){
                    Log.i("path", "tocado");
                    //paints.get(0).setColor(getColor(R.color.linea));
                    canvasg.drawPath(p, paintb);
                }
            }

            return super.onTouchEvent(event);
        }

        public void coordenadas(Canvas canvas) {

            int i;
            boolean tipo = true;

            String cadena = "13, 421, 7, 587, 274, 590, 262, 467, 106, 506, 65, 444, 12, 416" +
                "|81, 13, 95, 55, 378, 70, 368, 4" +
                "|543, 88, 522, 218, 751, 228, 750, 133, 602, 111" +
                "|34, 268, 33, 383, 278, 389, 433, 356, 429, 288, 281, 312" +
                "|46, 55, 21, 131, 119, 172, 275, 158, 273, 106, 89, 79";
            String cadenaArray[] = cadena.split("\\|");

            for (String img : cadenaArray) {

                ArrayList<Float> x = new ArrayList<Float>();
                ArrayList<Float> y = new ArrayList<Float>();

                String imgArray[] = img.split("\\,");
                for (String coordena : imgArray){
                    float fin = Float.parseFloat(coordena);
                    if (tipo){
                        x.add(fin);
                    } else {
                        y.add(fin);
                    }
                    tipo = !tipo;

                }

                dibujar(x,y, canvas);
            }
        }

        public void dibujar(ArrayList<Float> coordx, ArrayList<Float> coordy, Canvas canvas){
            Path path =new Path();
            paths.add(path);
            canvas.drawColor(getColor(android.R.color.transparent));

            path.moveTo(coordx.get(0), coordy.get(0));

            for (int z = 1; z < coordx.size(); z++){
                path.lineTo(coordx.get(z),coordy.get(z));
            }
            path.lineTo(coordx.get(0),coordy.get(0));
            canvas.drawPath(path, paintn);
        }
    }
}

我還沒有練習過,但是找到了解決方案。 由於android studio支持javascript和CSS,因此您可以執行自己要求的操作。 在給定的鏈接中,您可以找到所需任務的javascript和css文件。 然后,您可以點擊此給定的鏈接,其中提供了有關在Android Studio中添加javascript和css的所有信息。 點擊此鏈接

您可以使用觸摸委托(在Android SDK中)來實現。 您可能很難創建形狀,但是可以嘗試一下:)

這是Vogella教程的摘錄( http://blog.vogella.com/2012/04/15/android-using-touchdelegates/ ):

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mButton = (Button) findViewById(R.id.delegated_button);
        View parent = findViewById(R.id.root);
        parent.post(new Runnable() {
            public void run() {
                // Post in the parent's message queue to make sure the parent
                // lays out its children before we call getHitRect()
                Rect delegateArea = new Rect();
                Button delegate = mButton;
                delegate.getHitRect(delegateArea);
                delegateArea.top -= 600;
                delegateArea.bottom += 600;
                delegateArea.left -= 600;
                delegateArea.right += 600;
                TouchDelegate expandedArea = new TouchDelegate(delegateArea,
                        delegate);
                // give the delegate to an ancestor of the view we're
                // delegating the
                // area to
                if (View.class.isInstance(delegate.getParent())) {
                    ((View) delegate.getParent())
                            .setTouchDelegate(expandedArea);
                }
            };
        });
    }

祝好運!

唯一的方法就是以這種方式調用invalidate(),然后調用onDraw()並使用所需的更改重新繪制整個視圖。

onDraw()完成后,畫布無效。

我希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM