渲染不规则的按钮形状 - 最佳实践

时间:2015-04-05 08:56:28

标签: android

我正在尝试创建一个具有相当复杂UI的应用。 我试图了解在屏幕上呈现不规则按钮形状的最佳做法是什么。

我正在添加此图片作为示例。这些木板中的每一个都是一个按钮。 我显然不能使用Android的Button或ImageButton,因为形状不是矩形。

我假设我需要将它直接绘制到画布上或使用onDraw或Draw来实现这一点。 这是我用来将这些作为按钮渲染的正确方法吗? 关于这些的任何好的阅读材料都非常感谢..

谢谢

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以按以下方式创建自定义视图:

  1. onDraw()中绘制3个位图,每个位图代表单个按钮(其他2个按钮是透明的),
  2. onTouch()中检查触摸的像素与这些位图,看看点击了哪个位图
  3. 代码段:

    public class DrawingBoard extends View {
    
        Bitmap mBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.button1);
        Bitmap mBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.button2);
        Bitmap mBitmap3 = BitmapFactory.decodeResource(getResources(), R.drawable.button3);
    
        public DrawingBoard (Context context) {
            // TODO Auto-generated constructor stub
            super (context);            
        }
        @Override
        protected void onDraw (Canvas canvas) {
            canvas.drawBitmap(mBitmap1, 0, 0, null);
            canvas.drawBitmap(mBitmap2, 0, 0, null);
            canvas.drawBitmap(mBitmap3, 0, 0, null);
        }
        @Override
        public boolean onTouchEvent (MotionEvent event) {
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN : 
                    int xx = (int)event.getX();
                    int yy = (int)event.getY();
                    if(Color.alpha(mBitmap1.getPixel(xx,yy)) != 0) {
                        // button1 pressed
                    }
                    else if(Color.alpha(mBitmap2.getPixel(xx,yy)) != 0) {
                        // button2 pressed
                    }
                    else if(Color.alpha(mBitmap3.getPixel(xx,yy)) != 0) {
                        // button3 pressed
                    }
                    break;
            }
    
            return true;
    
        }
    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
        {
         // bitmaps are assumed to be of the same size
         setMeasuredDimension(mBitmap1.getWidth(),mBitmap1.getHeight());
        }    
    }
    

    我没有测试代码,它可能有错误。

    变体 - 您可以创建一个存储'命中代码的虚拟位图。对于整个图像上的像素。您可以从原始图片创建它,但用ids替换像素以检测触摸了哪个区域,所有其他像素使得空白' (为0x0)。所以getPixel()将返回一个按钮的id。