Android中用Drawable 自定义view的用法

代码是在W3cschool网站上安卓开发教程的最后部分摘抄的,原主也是在网上down下的代码。这篇文章主要是分析一下代码的实现过程。
链接:http://www.runoob.com/w3cnote/android-tutorial-drawable1.html
先上代码
代码中有做的标记。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /*setContentView(R.layout.activity_main);
        *这个是从前在xml里解析出view时的写法。*/
        setContentView(new SampleView(this));
        //SampleView是下面自己定义的写法。
    }
   //自定义的内容。
    private static class SampleView extends View {

        private ShapeDrawable[] mDrawables;
        /*建立一个数组来存放图形*/
        private static Shader makeSweep() {         
            return new SweepGradient(50, 25,
                    new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFF0000 },
                    null);
        }


        private static Shader makeLinear() {
            return new LinearGradient(0, 0, 50, 50,
                    new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF },
                    null, Shader.TileMode.MIRROR);
        }

        private static Shader makeTiling() {
            int[] pixels = new int[] { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0};
            Bitmap bm = Bitmap.createBitmap(pixels, 2, 2,
                    Bitmap.Config.ARGB_8888);

            return new BitmapShader(bm, Shader.TileMode.REPEAT,
                    Shader.TileMode.REPEAT);
        }
        /*这三个函数设置填充内容
        下面可以用到将其分别填充到三个图形中*/

        private static class MyShapeDrawable extends ShapeDrawable {
            private Paint mStrokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

            public MyShapeDrawable(Shape s) {
                super(s);
                mStrokePaint.setStyle(Paint.Style.STROKE);
            }

            public Paint getStrokePaint() {
                return mStrokePaint;
            }

            @Override 
            protected void onDraw(Shape s, Canvas c, Paint p) {
                s.draw(c, p);
                s.draw(c, mStrokePaint);
            }
        }
        //这个类是用来给下面最后一个图形加边框的

        public SampleView(Context context) {
            super(context);
            setFocusable(true);

            float[] outerR = new float[] { 30, 30, 30, 30, 30, 30, 30, 30 };
            RectF inset = new RectF(1, 1, 1, 1);
            float[] innerR = new float[] { 12, 12, 12, 12, 0, 0, 0, 0 };
            /*这三个数组时=是作为参数,传入创建矩形的方法里
            下面可以看到*/

            Path path = new Path();
            path.moveTo(50, 0);
            path.lineTo(0, 50);
            path.lineTo(50, 100);
            path.lineTo(100, 50);
            path.close();
            /*path也是参数,设置图6路径*/


            mDrawables = new ShapeDrawable[7];
            mDrawables[0] = new ShapeDrawable(new RectShape());
            /*画矩形*/
            mDrawables[1] = new ShapeDrawable(new OvalShape());
            mDrawables[2] = new ShapeDrawable(new RoundRectShape(outerR, null,
                    null));
            mDrawables[3] = new ShapeDrawable(new RoundRectShape(outerR, inset,
                    null));
            /* RoundRectShape画边框
             * 其中三个参数在上面设置过分别用来 
             * 四个角内矩形 左上、右上、右下、左下 圆角半径 ,
             * 内矩形距外矩形,左上角x,y距离, 右下角x,y距离  
             * 外矩形 左上、右上、右下、左下 圆角半径 */

            mDrawables[4] = new ShapeDrawable(new RoundRectShape(outerR, inset,
                    innerR));
            mDrawables[5] = new ShapeDrawable(new PathShape(path, 100, 100));
              /*PathShape
               以Path路径对象,来设定图形。
               PathShape的构造函数:
               PathShape(path, stdWidth, stdHeight);
               stdWidth:标准宽度
               stdHeight:标准高度*/
            mDrawables[6] = new MyShapeDrawable(new ArcShape(45, -270));
            /*ARCShape画出扇形 两个参数分别是起始和扫描角度*/

            /*ShapeDrawable是对普通图形的包装*/


            mDrawables[0].getPaint().setColor(0xFFFFFF00);
            mDrawables[1].getPaint().setColor(0xFF00FF00);
            mDrawables[2].getPaint().setColor(0xFF0000FF);
            mDrawables[3].getPaint().setShader(makeSweep());
            mDrawables[4].getPaint().setShader(makeLinear());
            mDrawables[5].getPaint().setShader(makeTiling());
      //将6个图形进行包装成一个类,设置颜色,填充物等,传送到一个数组中。

            PathEffect pe = new DiscretePathEffect(10, 4);
            PathEffect pe2 = new CornerPathEffect(4);
            mDrawables[3].getPaint().setPathEffect(
                    new ComposePathEffect(pe2, pe));

            MyShapeDrawable msd = (MyShapeDrawable)mDrawables[6];
            msd.getStrokePaint().setStrokeWidth(5);
            //最后一个图形:类型转换,然后setStrokeWidth设置边框宽度。
        }

        @Override protected void onDraw(Canvas canvas) {
            /*这个函数用for循环来设置几个图形的长宽高和位置*/
            int x = 100;
            int y = 100;
            int width = 100;
            int height = 100;

            for (Drawable dr : mDrawables) {
                dr.setBounds(x , y, x + width, y + height);
                dr.draw(canvas);
                y += height + 5;
            }
        }
    }
}

最后效果
这就是这几个图形的最终效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,Drawable是一种可绘制的图像对象,可以用于绘制各种形状的图像,如位图、矢量图等。下面是使用Drawable图片的教程: 1. 创建Drawable资源文件 在Android Studio中,可在res/drawable目录下创建Drawable资源文件,支持的文件格式包括PNG、JPG、GIF等。例如,创建一个名为ic_launcher的PNG图片文件,可在drawable目录下创建ic_launcher.png文件。 2. 在布局文件中引用Drawable资源 在布局文件中,可通过ImageView控件引用Drawable资源,例如: ``` <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher"/> ``` 其中,@drawable/ic_launcher表示引用名为ic_launcher的Drawable资源。 3. 在代码中引用Drawable资源 在代码中,可通过Context的getDrawable()方法获取Drawable资源,例如: ``` Drawable drawable = context.getDrawable(R.drawable.ic_launcher); ``` 其中,R.drawable.ic_launcher表示引用名为ic_launcher的Drawable资源的ID。 4. 设置Drawable图片的属性 Drawable图片可以设置不同的属性,例如透明度、边框、大小等。可通过代码方式设置Drawable图片的属性,例如: ``` Drawable drawable = context.getDrawable(R.drawable.ic_launcher); // 设置透明度为50% drawable.setAlpha(128); // 设置边框为红色,宽度为2dp drawable.setStroke(2, Color.RED); // 设置大小为50dp * 50dp drawable.setBounds(0, 0, 50, 50); ``` 以上是使用Drawable图片的教程,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值