以编程方式向ShapeDrawable添加阴影

时间:2012-12-26 14:53:27

标签: java android shadow shapedrawable

我正在尝试以编程方式制作具有不同渐变的按钮。我使用ShapeDrawable,它就像一个魅力。

RoundRectShape rs = new RoundRectShape(new float[] { 12f, 12f, 12f, 12f, 12f, 12f, 12f, 12f }, null, null);
ShapeDrawable sd = new ShapeDrawable(rs);
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {

    @Override
    public Shader resize(int width, int height) {
        LinearGradient lg = new LinearGradient(0, 0, 0, height,
                new int[] { 
                    Color.parseColor("#feccb1"), 
                    Color.parseColor("#f17432"), 
                    Color.parseColor("#e86320"),
                    Color.parseColor("#f96e22") },
                new float[] {
                    0, 0.50f, 0.50f, 1 },
                Shader.TileMode.REPEAT);
             return lg;
        }
    };
sd.setShaderFactory(sf);
myBtn.setBackgroundDrawable(sd);

但是我想在程序上为按钮添加阴影而不是按钮文本。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:8)

  

但是我想为按钮添加阴影,而不是按钮   文本编程。

我猜你想要建立你当前绘制的阴影。如果是,那么将LayerDrawable与另一个Drawable(放在第一位)一起作为影子:

    RoundRectShape rss = new RoundRectShape(new float[] { 12f, 12f, 12f,
            12f, 12f, 12f, 12f, 12f }, null, null);
    ShapeDrawable sds = new ShapeDrawable(rss);
    sds.setShaderFactory(new ShapeDrawable.ShaderFactory() {

        @Override
        public Shader resize(int width, int height) {
            LinearGradient lg = new LinearGradient(0, 0, 0, height,
                    new int[] { Color.parseColor("#e5e5e5"),
                            Color.parseColor("#e5e5e5"),
                            Color.parseColor("#e5e5e5"),
                            Color.parseColor("#e5e5e5") }, new float[] { 0,
                            0.50f, 0.50f, 1 }, Shader.TileMode.REPEAT);
            return lg;
        }
    });

    LayerDrawable ld = new LayerDrawable(new Drawable[] { sds, sd });
    ld.setLayerInset(0, 5, 5, 0, 0); // inset the shadow so it doesn't start right at the left/top
    ld.setLayerInset(1, 0, 0, 5, 5); // inset the top drawable so we can leave a bit of space for the shadow to use

    b.setBackgroundDrawable(ld);

答案 1 :(得分:0)

更简洁的方法是使用Paint.setShadowLayer

中的function applyClientFilters() { var listView = $("#ProductsList").data("kendoListView"); var listViewDataSource = listView.dataSource; // clear existing datasource listViewDataSource.filter([]); // extract selected items from each of the dropdown controls and the search box var productType = $("#ProductTypeDropDown").data("kendoDropDownList").value(); var therapeuticClass = $("#TherapeuticClassDropDown").data("kendoDropDownList").value(); var searchString = $(".search-filter").val(); // setup filter object (using and logic) var filter = { logic: "and", filters: [] // ready for filter from each of the dropdowns and search bar }; // push new filter into array of filters with or logic on each filter if (productType.length > 0) { var productTypeFilter = { logic: "or", filters: [ { field: "ProductTypeId", operator: "equals", value: productType } ] }; filter.filters.push(productTypeFilter); } if (therapeuticClass.length > 0) { var therapeuticClassFilter = { logic: "or", filters: [ { field: "TherapeuticClasses", operator: function (itemValue, value) { return itemValue && itemValue.find(function (item) { if (item.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1) { return true; } else { return false; } }); }, value: therapeuticClass } ] }; filter.filters.push(therapeuticClassFilter); } if (searchString.length > 0) { var searchFilter = { logic: "or", filters: [ { field: "Name", operator: "startswith", value: searchString }, { field: "ProductTypeDisplay", operator: "startswith", value: searchString }, { field: "NdcCode", operator: "startswith", value: searchString }, { field: "TherapeuticClasses", operator: function(itemValue, value) { return itemValue && itemValue.find(function(item) { // If a therapeutic class name matches search then return true if (item.Name.toLowerCase().indexOf(value.toLowerCase()) !== -1) { return true; } else { return false; } }); }, value: searchString } ] }; filter.filters.push(searchFilter); } // apply filter query to datasource listViewDataSource.query({ filter: filter }); }