精华内容
下载资源
问答
  • WPF之复杂形状控件

    2018-11-02 01:45:00
    WPF之复杂形状控件 原文:WPF之复杂形状控件有的时候想将一张图片变成一个按钮。当然这里不是单纯讲图片作为按钮的背景。 这两者是有区别的: 前者图片即按钮,比如你有一个空心的圆圈,当你点击中间...
    原文:WPF之复杂形状控件

    有的时候想将一张图片变成一个按钮。当然这里不是单纯讲图片作为按钮的背景。

    这两者是有区别的:

    前者图片即按钮,比如你有一个空心的圆圈,当你点击中间空心部分的时候是没有任何反应的因为它不是属于按钮的一部分;

    后者图片仅仅是背景,你有一个空心的圆圈图片做背景,点击空心部分的时候就还是有反应,因为按钮的实际区域是一个方形。

    上个手~~~给个Demo就啥都懂了~~

    哦,对了,还没说中心思想是吧~~~

    其实呢也就是一个形状嘛,那怎么不规则的形状就是Path嘛,

    那么图片转成Path就可以了吗?早呢么转呢?给美工~~

    PNG图片~~~生成工作路径~~本来开始是用PS的,搞不定,后来用的FW,保存为.psd文件,然后用Blend导入就好了。

    美工的那部分我就不截图了,具体Blend操作流程我给你们抓图看看~

     

    步骤一:导入图片

    步骤二:选择路径

    步骤三:将路径构成控件

    步骤四:调整控件样式

    步骤五:为样式添加相关触发信息代码

     

     

    附上Demo里面有图片,就是这个程序用的那张  奥迪王.psd,没有美工的可以自己试试,到时候找张图弄个png自己再试试就好了。我只能帮你们到这里了。

    写在后面的文字:最主要的思想呢就是用路径构成Button,那么PNG图片通过PS或者FW是可以转化成工作路径,然后保存为.psd文件的,再导入Blend中。

     

    posted on 2018-11-02 01:45 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9893639.html

    展开全文
  • 本文带大家了解 Android 特殊形状控件的事件处理方式,主要是利用了 Region 和 Matrix 的一些方法,超级实用的事件处理方案,相信看完本篇之后,任何奇葩控件的事件处理都会变得十分简单。 不得不说,Android 对...

    本文带大家了解 Android 特殊形状控件的事件处理方式,主要是利用了 Region 和 Matrix 的一些方法,超级实用的事件处理方案,相信看完本篇之后,任何奇葩控件的事件处理都会变得十分简单。

    不得不说,Android 对事件体系封装的非常棒,即便对事件体系不太了解的人,只要简单的调用方法就能使用,而且具有防呆设计,能够保证事件流的完整性和统一性,最大可能性的避免了事件处理的混乱,着实令人佩服。

    然而世界上并没有绝对完美的东西, 当【事件处理】遇上【自定义View】,一场好戏就开演了,玩的好叫坐镇军前,指挥千军万马而分毫不乱,玩的不好就是抓耳挠腮,眼见敌人前后包抄而无可奈何。

    特殊形状控件

    在通常的情况下,自定义 View 直接使用系统的事件体系处理就行,我们也不需要特殊处理,然而当一些特殊的控件出现的时候,麻烦就来了,举个栗子:

    这是一个在遥控器上非常常见的按键布局,注意中间上下左右选择的部分,看起来十分简单,然而当你真正准备在手机上实现的时候麻烦就出现了。因为所有的View默认都是矩形的,所以事件接收区域也是矩形的,如果直接使用系统提供的 View 来组合出一摸一样的布局也很简单,但点击区域该如何处理?显然这样有部分点击区域是在控件外面的,并且控件之间会产生重叠区域,点击的时候容易判断错误,例如:

    红色方框表示用 View 组合的情况下,单个 View 的可点击区域。

    当我们面对这样比较奇特的控件的时候,有很多处理办法,比较投机的一种就是背景贴一个静态图,按钮做成透明的,设置小一点,放在对应的位置,这样可以保证不会误触,当然了如果想要点击效果可以在按钮按下的时候更新一下背景图,这样虽然也可以,但可点击区域会变小,体验效果会变差。设计方案变得非常复杂,而且逻辑也不容易处理,可以说是一种非常糟糕的设计。

    当然了,看了我这么多文章的小伙伴应该也猜到我接下来要说什么了,没错,就是自定义 View。当我们面对一些奇葩控件的时候,自定义 View 就变成了一种非常好用的处理方案。

    相信小伙伴们看过前面的文章 之后,对各种图形的绘制已经不成问题了,所以我们直接处理重点问题。

    特殊形状控的点击区域判断

    要进行特殊形状的点击判断,要用到一个之前没有使用过的类:Region。

    Region 直接翻译的意思是 地域,区域。 在此处应该是区域的意思 。它和 Path 有些类似,但 Path 可以是不封闭图形,而 Region 总是封闭的。可以通过 setPath 方法将 Path 转换为 Region。

    本文中我们重点要使用到的是 Region 中的 contains 方法,这个方法可以判断一个点是否包含在该区域内。

    下面是一个简单的示例程序:

    public class RegionClickView extends View {
        Paint mPaint;
        Region globalRegion;
        Region circleRegion1;
        Region circleRegion2;
        Path circlePath1;
        Path circlePath2;
    
        public RegionClickView(Context context) {
            super(context);
    
            mPaint = new Paint();
            mPaint.setStyle(Paint.Style.FILL);
            mPaint.setColor(Color.GRAY);
    
            // 用Path创建两个圆
            circlePath1 = new Path();
            circlePath2 = new Path();
            circlePath1.addCircle(100, 100, 50, Path.Direction.CW);
            circlePath2.addCircle(400, 400, 50, Path.Direction.CW);
    
            // 创建 Region
            circleRegion1 = new Region();
            circleRegion2 = new Region();
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            // 将剪裁边界设置为视图大小
            globalRegion = new Region(0, 0, w, h);
    
            // ▼将 Path 添加到 Region 中
            circleRegion1.setPath(circlePath1, globalRegion);
            circleRegion2.setPath(circlePath2, globalRegion);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    int x = (int) event.getX();
                    int y = (int) event.getY();
    
                    // ▼点击区域判断
                    if (circleRegion1.contains(x,y)){
                        Toast.makeText(this.getContext(),"圆1被点击",Toast.LENGTH_SHORT).show();
                    }
                    if (circleRegion2.contains(x,y)){
                        Toast.makeText(this.getContext(),"圆2被点击",Toast.LENGTH_SHORT).show();
                    }
                    break;
            }
            return super.onTouchEvent(event);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            // ▼注意此处将全局变量转化为局部变量,方便 GC 回收 Canvas
            Path circle1 = circlePath1;
            Path circle2 = circlePath2;
    
            // 绘制两个圆
            canvas.drawPath(circle1,mPaint);
            canvas.drawPath(circle2,mPaint);
        }
    }

    代码中比较重要的内容都用 ▼ 符号标记出来了。

    上述代码非常简单,就是创建了两个 Path,在 Path 中添加圆形,之后将 Path 设置到 Region 中,当手指在屏幕上按下的时候判断一个手指按下位置是否在 Region 区域内。

    代码整体逻辑非常简单,大家测试一下就行了。

    画布变换后坐标转换问题

    还是上述的例子,绘制一个上下左右选择按键,这个控件是上下左右对称的,熟悉我代码风格的小伙伴都知道,如果遇上这种问题,我肯定是要将坐标系平移到这个控件中心的,这样数据比较好计算,然而进行画布变换操作会产生一个新问题: 手指触摸的坐标系和画布坐标系不统一,就可能引起手指触摸位置和绘制位置不统一。

    举个栗子:

    在手指按下位置绘制一个圆。

    public class CanvasVonvertTouchTest extends CustomView{
        float down_x = -1;
        float down_y = -1;
    
        public CanvasVonvertTouchTest(Context context) {
            this(context, null);
        }
    
        public CanvasVonvertTouchTest(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getActionMasked()){
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_MOVE:
                    down_x = event.getX();
                    down_y = event.getY();
                    invalidate();
                    break;
    
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    down_x = down_y = -1;
                    invalidate();
                    break;
            }
    
            return true;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            float x = down_x;
            float y = down_y;
    
            // 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点
            drawTouchCoordinateSpace(canvas);
    
            canvas.translate(mViewWidth/2, mViewHeight/2);  // 画布平移
    
            // 绘制平移后的坐标系,颜色为红色
            drawTranslateCoordinateSpace(canvas);
    
            // 如果没有就返回
            if (x == -1 && y == -1)
                return;
    
            // 在触摸位置绘制一个小圆
            canvas.drawCircle(x,y,20,mDeafultPaint);
        }
    
        /**
         *  绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点
         */
        private void drawTouchCoordinateSpace(Canvas canvas) {
            canvas.save();
            canvas.translate(10,10);
            CanvasAidUtils.set2DAxisLength(1000, 0, 1400, 0);
            CanvasAidUtils.setLineColor(Color.GRAY);
            CanvasAidUtils.draw2DCoordinateSpace(canvas);
            canvas.restore();
        }
    
        /**
         * 绘制平移后的坐标系,颜色为红色
         */
        private void drawTranslateCoordinateSpace(Canvas canvas) {
            CanvasAidUtils.set2DAxisLength(500, 500, 700, 700);
            CanvasAidUtils.setLineColor(Color.RED);
            CanvasAidUtils.draw2DCoordinateSpace(canvas);
            CanvasAidUtils.draw2DCoordinateSpace(canvas);
        }
    }

    可以看到,直接拿手指触摸位置的坐标来绘制会导致绘制位置不正确,大概会像这样子:

    两者坐标是相同的,但是由于坐标系不同,导致实际显示位置不同。

    那么问题来了,我们在之前的文章中讲过,映射不同坐标系的坐标用 什么来着?

    是 Matrix。

    如果看过我之前的文章但没有想起来的说明你们根本没有认真看,全部拖出去糟蹋 5 分钟!

    没看过的点Matrix原理 和Matrix详解 。

    Matrix 是一个矩阵,主要功能是坐标映射,数值转换。

    那么接下来我们就对上面的示例进行简单的改造一下,让触摸位置和实际绘制绘制重合。

    注意:比较重要的修改位置用▼标记出来了。

    public class CanvasVonvertTouchTest extends CustomView{
        float down_x = -1;
        float down_y = -1;
    
        public CanvasVonvertTouchTest(Context context) {
            this(context, null);
        }
    
        public CanvasVonvertTouchTest(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getActionMasked()){
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_MOVE:
                    // ▼ 注意此处使用 getRawX,而不是 getX
                    down_x = event.getRawX();
                    down_y = event.getRawY();
                    invalidate();
                    break;
    
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    down_x = down_y = -1;
                    invalidate();
                    break;
            }
    
            return true;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            float[] pts = {down_x, down_y};
    
            // 绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点
            drawTouchCoordinateSpace(canvas);
    
            canvas.translate(mViewWidth/2, mViewHeight/2);  // 画布平移
    
            // 绘制平移后的坐标系,颜色为红色
            drawTranslateCoordinateSpace(canvas);
    
            // 如果没有就返回
            if (pts[0] == -1 && pts[1] == -1)
                return;
    
            // ▼ 获得当前矩阵的逆矩阵
            Matrix invertMatrix = new Matrix();
            canvas.getMatrix().invert(invertMatrix);
    
            // ▼ 使用 mapPoints 将触摸位置转换为画布坐标
            invertMatrix.mapPoints(pts);
    
            // 在触摸位置绘制一个小圆
            canvas.drawCircle(pts[0],pts[1],20,mDeafultPaint);
        }
    
        /**
         *  绘制触摸坐标系,颜色为灰色,为了能够显示出坐标系,将坐标系位置稍微偏移了一点
         */
        private void drawTouchCoordinateSpace(Canvas canvas) {
            canvas.save();
            canvas.translate(10,10);
            CanvasAidUtils.set2DAxisLength(1000, 0, 1400, 0);
            CanvasAidUtils.setLineColor(Color.GRAY);
            CanvasAidUtils.draw2DCoordinateSpace(canvas);
            canvas.restore();
        }
    
        /**
         * 绘制平移后的坐标系,颜色为红色
         */
        private void drawTranslateCoordinateSpace(Canvas canvas) {
            CanvasAidUtils.set2DAxisLength(500, 500, 700, 700);
            CanvasAidUtils.setLineColor(Color.RED);
            CanvasAidUtils.draw2DCoordinateSpace(canvas);
            CanvasAidUtils.draw2DCoordinateSpace(canvas);
        }
    }

    绘制结果:

    小白点和黑色的圆没有完全重合是因为系统显示触摸位置的绘制逻辑和我使用的绘制逻辑不太相同,两者的位置是一样的。

    其实核心部分就这两点:

    // ▼ 注意此处使用 getRawX,而不是 getX
    down_x = event.getRawX();
    down_y = event.getRawY();
    
    // -------------------------------------
    
    // ▼ 获得当前矩阵的逆矩阵
    Matrix invertMatrix = new Matrix();
    canvas.getMatrix().invert(invertMatrix);
    
    // ▼ 使用 mapPoints 将触摸位置转换为画布坐标
    invertMatrix.mapPoints(pts);
    1. 使用全局坐标系
    2. 使用逆矩阵的 mapPoints

    原理嘛,其实非常简单,我们在画布上正常的绘制,需要将画布坐标系转换为全局坐标系后才能真正的绘制内容。所以我们反着来,将获得到的全局坐标系坐标使用当前画布的逆矩阵转化一下,就转化为当前画布的坐标系坐标了,如果对Matrix原理 和Matrix详解 理解了,即便我不说你们也肯定会想到这个方案的。

    仿遥控器按钮代码示例

    在解决了上述两大难题之后,相信不论形状如何奇葩的自定义控件,基本上都难不倒大家了,最后用一个简单的示例作为结尾,还是文章开头所举的例子,核心内容就是上面讲的两个东西。

    public class RemoteControlMenu extends CustomView {
        Path up_p, down_p, left_p, right_p, center_p;
        Region up, down, left, right, center;
    
        Matrix mMapMatrix = null;
    
        int CENTER = 0;
        int UP = 1;
        int RIGHT = 2;
        int DOWN = 3;
        int LEFT = 4;
        int touchFlag = -1;
        int currentFlag = -1;
    
        MenuListener mListener = null;
    
        int mDefauColor = 0xFF4E5268;
        int mTouchedColor = 0xFFDF9C81;
    
    
        public RemoteControlMenu(Context context) {
            this(context, null);
        }
    
        public RemoteControlMenu(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            up_p = new Path();
            down_p = new Path();
            left_p = new Path();
            right_p = new Path();
            center_p = new Path();
    
            up = new Region();
            down = new Region();
            left = new Region();
            right = new Region();
            center = new Region();
    
            mDeafultPaint.setColor(mDefauColor);
          	mDeafultPaint.setAntiAlias(true);
    
            mMapMatrix = new Matrix();
    
        }
    
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            super.onSizeChanged(w, h, oldw, oldh);
            mMapMatrix.reset();
    		
          	// 注意这个区域的大小
            Region globalRegion = new Region(-w, -h, w, h);
            int minWidth = w > h ? h : w;
            minWidth *= 0.8;
    
            int br = minWidth / 2;
            RectF bigCircle = new RectF(-br, -br, br, br);
    
            int sr = minWidth / 4;
            RectF smallCircle = new RectF(-sr, -sr, sr, sr);
    
            float bigSweepAngle = 84;
            float smallSweepAngle = -80;
    
            // 根据视图大小,初始化 Path 和 Region
            center_p.addCircle(0, 0, 0.2f * minWidth, Path.Direction.CW);
            center.setPath(center_p, globalRegion);
    
            right_p.addArc(bigCircle, -40, bigSweepAngle);
            right_p.arcTo(smallCircle, 40, smallSweepAngle);
            right_p.close();
            right.setPath(right_p, globalRegion);
    
            down_p.addArc(bigCircle, 50, bigSweepAngle);
            down_p.arcTo(smallCircle, 130, smallSweepAngle);
            down_p.close();
            down.setPath(down_p, globalRegion);
    
            left_p.addArc(bigCircle, 140, bigSweepAngle);
            left_p.arcTo(smallCircle, 220, smallSweepAngle);
            left_p.close();
            left.setPath(left_p, globalRegion);
    
            up_p.addArc(bigCircle, 230, bigSweepAngle);
            up_p.arcTo(smallCircle, 310, smallSweepAngle);
            up_p.close();
            up.setPath(up_p, globalRegion);
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float[] pts = new float[2];
            pts[0] = event.getRawX();
            pts[1] = event.getRawY();
            mMapMatrix.mapPoints(pts);
    
            int x = (int) pts[0];
            int y = (int) pts[1];
    
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    touchFlag = getTouchedPath(x, y);
                    currentFlag = touchFlag;
                    break;
                case MotionEvent.ACTION_MOVE:
                    currentFlag = getTouchedPath(x, y);
                    break;
                case MotionEvent.ACTION_UP:
                    currentFlag = getTouchedPath(x, y);
                	// 如果手指按下区域和抬起区域相同且不为空,则判断点击事件
                    if (currentFlag == touchFlag && currentFlag != -1 && mListener != null) {
                        if (currentFlag == CENTER) {
                            mListener.onCenterCliched();
                        } else if (currentFlag == UP) {
                            mListener.onUpCliched();
                        } else if (currentFlag == RIGHT) {
                            mListener.onRightCliched();
                        } else if (currentFlag == DOWN) {
                            mListener.onDownCliched();
                        } else if (currentFlag == LEFT) {
                            mListener.onLeftCliched();
                        }
                    }
                    touchFlag = currentFlag = -1;
                    break;
                case MotionEvent.ACTION_CANCEL:
                    touchFlag = currentFlag = -1;
                    break;
            }
    
            invalidate();
            return true;
        }
    
      	// 获取当前触摸点在哪个区域
        int getTouchedPath(int x, int y) {
            if (center.contains(x, y)) {
                return 0;
            } else if (up.contains(x, y)) {
                return 1;
            } else if (right.contains(x, y)) {
                return 2;
            } else if (down.contains(x, y)) {
                return 3;
            } else if (left.contains(x, y)) {
                return 4;
            }
            return -1;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.translate(mViewWidth / 2, mViewHeight / 2);
    
            // 获取测量矩阵(逆矩阵)
            if (mMapMatrix.isIdentity()) {
                canvas.getMatrix().invert(mMapMatrix);
            }
    
          	// 绘制默认颜色
            canvas.drawPath(center_p, mDeafultPaint);
            canvas.drawPath(up_p, mDeafultPaint);
            canvas.drawPath(right_p, mDeafultPaint);
            canvas.drawPath(down_p, mDeafultPaint);
            canvas.drawPath(left_p, mDeafultPaint);
    
          	// 绘制触摸区域颜色
            mDeafultPaint.setColor(mTouchedColor);
            if (currentFlag == CENTER) {
                canvas.drawPath(center_p, mDeafultPaint);
            } else if (currentFlag == UP) {
                canvas.drawPath(up_p, mDeafultPaint);
            } else if (currentFlag == RIGHT) {
                canvas.drawPath(right_p, mDeafultPaint);
            } else if (currentFlag == DOWN) {
                canvas.drawPath(down_p, mDeafultPaint);
            } else if (currentFlag == LEFT) {
                canvas.drawPath(left_p, mDeafultPaint);
            }
            mDeafultPaint.setColor(mDefauColor);
        }
    
        public void setListener(MenuListener listener) {
            mListener = listener;
        }
    
       	// 点击事件监听器
        public interface MenuListener {
            void onCenterCliched();
    
            void onUpCliched();
    
            void onRightCliched();
    
            void onDownCliched();
    
            void onLeftCliched();
        }
    }

    运行效果:

    当手指在某一区域活动时,该区域会高亮显示,如果注册了监听器,点击某一区域会触发监听器回调。

    总结

    本文虽然代码比较多,但核心概念非常简单,主要涉及以下两点:

    1. Region 的区域检测。
    2. Matrix 的坐标映射。

    这两个知识点都不是很难,然而灵活运用起来却是非常强大的,如果有对 Matrix 不了解的小伙伴,推荐去看我之前的文章,里面有关于Matrix的详细介绍,

     

     

    来自:http://www.gcssloop.com/customview/touch-matrix-region

    展开全文
  • VB直线与形状控件: Visual Basic利用直线与形状控件,可以使窗体上显示的内容更为丰富,如在窗体上增加简单的线条和实心图形等等。 1、VB利用直线控件,可以建立简单的直线,通过修改其属性,还可以改变直线的...

    主讲老师:郭盛华

     

    VB直线与形状控件:

     

    Visual Basic利用直线与形状控件,可以使窗体上显示的内容更为丰富,如在窗体上增加简单的线条和实心图形等等。
    1、VB利用直线控件,可以建立简单的直线,通过修改其属性,还可以改变直线的粗细、色彩,以及线型。

     

    通过设置形状的属性,用户可以画出圆、椭圆,以及圆角矩形,同时还能设置形状的色彩与填充图案。

     

    2、在窗体上添加不同形状的图形。

     

    在属性share中选择你想要的形状。

     

     

    具体请看视频教程:微博@郭盛华老师
    展开全文
  • 制作不规则的控件,比如圆形,椭圆,只给出方法。初学者自己看看就行了,大神级别的就不要见笑了。
  • Shape 属性形状控件Shape

    千次阅读 2016-09-07 11:03:08
    返回或设置一个值,该值指示一个 Shape 控件的外观。 语法 object.Shape [= value] Shape 属性的语法包含下面部分: 部分 描述 Object 对象表达式,其值是“应用于”列表中的一个对象。 Value 用来指定控件...
    返回或设置一个值,该值指示一个 Shape 控件的外观。
    语法
    object.Shape [= value]
    Shape 属性的语法包含下面部分:
    部分 描述
    Object 对象表达式,其值是“应用于”列表中的一个对象。
    Value 用来指定控件外观的整数,“设置值”中有详细描述。


    设置值
    value 的设置值为:
    常数 设置值 描述
    VbShapeRectangle 0 (缺省值)矩形
    VbShapeSquare 1 正方形
    VbShapeOval 2 椭圆形
    VbShapeOval 3 圆形
    VbShapeRoundedRectangle 4 圆角矩形
    VbShapeRoundedSquare
     


    Private Sub Command1_Click()
    For I = 1 To 5
    'Shape1(I).Left = Shape1(I - 1).Left + 1000
    Shape1(I).Shape = I
    Shape1(I).FillStyle = I + 2
    CurrentX = CurrentX + 850
    Print I;
    Next
    End Sub
    展开全文
  • 有时,利用程序生成的WPF的UI控件对象,其事件无法冒泡到其背后的父/祖父控件上。比如以下代码,在代码中生成了一系列的Reatangle对象,但是rect对象的事件无法冒泡到myGridControl的上级控件上。 public void ...
  • 《Axure 6.5超短篇笔记》——在Axure中制作4种不同形状控件组的方式 讨论请移步至:http://bbs.hpx-party.org/thread-52032-1-1.html 欢迎转发新浪微博:http://weibo.com/1689646705/yrEHxyY2U 欢迎转发腾讯微博...
  • 做了一个形状控件,想把命令按钮和文本框控件显示在形状控件之上,以前曾经做过类似的效果,时间太久忘记掉了。 今天又做了一个形状控件,怎么设置 形状控件都是覆盖在其他控件上的,运行表单的话根本点不到形状...
  • 任意形状按钮控件

    2006-02-23 09:05:59
    任意形状按钮控件
  • MFC任意形状按钮控件

    2015-04-24 09:26:09
    任意形状按钮控件,很漂亮的之定义按钮!
  • 自定义控件形状

    2017-11-02 22:16:32
    继承View类或其子类 ...自定义形状: 重写两个方法: 一.onMeasure(int widthMeasureSpec, int heightMeasureSpec) //测量大小,两个参数分别是宽和高的尺寸以及模式AT_MOST,EXACTLY,UNSPECIFIED(分别对应match_p
  • FastReport中,如果要画一张漂亮的报表,经常会画些形状控件来美化?那么如何用好形状(Shape)控件呢? 形状的5种类型 在工具栏的图形控件下拉菜单中有5种类型(矩形、圆角矩形、椭圆形、三角形、菱形),对应图形...
  • 因此笔者建议使用shape自定义View控件的外观。  建议理由:shape只能自定义简单形状和颜色填充,然而却有完美的边缘渲染,不会出现边缘锯齿或者模糊的廉价感,这一点对于android UI是十分重要的。并且shape的操作和...
  • 控件的属性 -改变控件形状例如:圆角按钮的实现1.在drawable中新建xml文件,选择shape属性(双) 2.选择属性;源码:这里写代码片
  • 创建任何自定义形状控件 步骤如下: ●创建一个GraphicsPath类的实例对象。 ●指定好该对象的各项细节(如大小、形状等等)。 ●将控件的Region属性设置为上面建立的GraphicsPath类的实例对象。 ...
  • Android控件自定义形状

    2017-11-15 23:41:00
    Android中处理控件的各种形状可以用到Shape,ApiDemos中有相关的例子,在com.example.android.apis.graphics中的ShapeDrawable1类中有很详细的介绍和例子。使用xml的方法也能达到同样的效果,而且更加方便。如下面的...
  • QML利用Canvas绘制特殊形状UI控件 Canvas { id: canvas anchors.centerIn: parent width: 600 height: 600 antialiasing: true property real centerWidth: width/2 ...
  • 求大神教我winform中如何更改label控件的系统自动生成的形状。。。。。
  • MFC任意形状的按钮控件,是继承了CButton类做出来的,使用的话将头文件和CPP文件拷到你的工程中,加入宏定义就可以使用!
  • 继续上一篇文章:Android自定义控件(一)控件的绘制及动画上一篇文章叙述了自定义控件的绘制和动画的解决方案,现在进一步确定控件的onMeasure函数以及形状...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,904
精华内容 761
关键字:

形状控件