Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绘制api低于23的复杂可绘制图形_Java_Android_Drawable_Android Drawable_Xml Drawable - Fatal编程技术网

Java 绘制api低于23的复杂可绘制图形

Java 绘制api低于23的复杂可绘制图形,java,android,drawable,android-drawable,xml-drawable,Java,Android,Drawable,Android Drawable,Xml Drawable,我正在尝试绘制由圆形和矩形组成的可绘制图形。api设置为23时,它工作正常。我注意到在最新的api中添加了“item”的以下属性:身高、重力、体重。是否有可能在旧sdk中获得效果 可拉伸: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:hei

我正在尝试绘制由圆形和矩形组成的可绘制图形。api设置为23时,它工作正常。我注意到在最新的api中添加了“item”的以下属性:身高、重力、体重。是否有可能在旧sdk中获得效果

可拉伸:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:height="5dp"
        android:gravity="center_vertical"
        android:left="5dp">
        <shape android:shape="rectangle">
            <size
                android:width="50dp"
                android:height="5dp" />
            <solid android:color="#125572" />
        </shape>
    </item>
    <item
        android:width="20dp"
        android:height="20dp"
        android:gravity="center_vertical">
        <shape android:shape="oval">
            <solid android:color="#125572" />
            <size
                android:width="20dp"
                android:height="20dp" />
        </shape>
    </item>
</layer-list>

使用api 23的图像:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:height="5dp"
        android:gravity="center_vertical"
        android:left="5dp">
        <shape android:shape="rectangle">
            <size
                android:width="50dp"
                android:height="5dp" />
            <solid android:color="#125572" />
        </shape>
    </item>
    <item
        android:width="20dp"
        android:height="20dp"
        android:gravity="center_vertical">
        <shape android:shape="oval">
            <solid android:color="#125572" />
            <size
                android:width="20dp"
                android:height="20dp" />
        </shape>
    </item>
</layer-list>

使用api 22的图像:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:height="5dp"
        android:gravity="center_vertical"
        android:left="5dp">
        <shape android:shape="rectangle">
            <size
                android:width="50dp"
                android:height="5dp" />
            <solid android:color="#125572" />
        </shape>
    </item>
    <item
        android:width="20dp"
        android:height="20dp"
        android:gravity="center_vertical">
        <shape android:shape="oval">
            <solid android:color="#125572" />
            <size
                android:width="20dp"
                android:height="20dp" />
        </shape>
    </item>
</layer-list>

我知道这个问题已经很老了,但我解决了这个问题,也许它对现在的人有用

对于解决方案,我创建了两个类

一个名为MyLayerDrawable的类扩展了LayerDrawable。关于这个类,需要记住的重要一点是,您可以获得每个层的顶部和左侧插图

public class MyLayerDrawable extends LayerDrawable{


private List<Layer> layers;

//some code here

public static class Layer{
    private Drawable drawable;
    private int topInset;
    private int leftInset;
    public Layer(Drawable drawable,int topInset,int leftInset){
        this.leftInset=leftInset;
        this.drawable=drawable;
        this.topInset=topInset;
    }
    public Drawable getDrawable(){
        return drawable;
    }
    public int getTopInset(){
        return topInset;
    }
    public int getLeftInset(){return leftInset;}
}
但是在调用setImageDrawable方法之前,已经在MyImageViewPatch构造函数中将一个observer对象添加到ImageView中。在ImageView中绘制可绘制图形之前,将调用此观察者:

        imageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            MyLayerDrawable layerDrawable=(MyLayerDrawable)imageView.getDrawable();
            int numberOfLayers=layerDrawable.getNumberOfLayers();
            Drawable drawable;
            Rect bounds;


            for(int i=0;i<numberOfLayers;i++){//for each layer
                drawable=layerDrawable.getDrawable(i);
                bounds=drawable.getBounds();
                bounds.top=layerDrawable.getLayer(i).getTopInset();
                bounds.left=layerDrawable.getLayer(i).getLeftInset();
                if(drawable.getIntrinsicHeight()<bounds.height()){
                    bounds.bottom=drawable.getIntrinsicHeight()+layerDrawable.getLayer(i).getTopInset();

                }
                if(drawable.getIntrinsicWidth()<bounds.width()){
                    bounds.right=drawable.getIntrinsicWidth()+layerDrawable.getLayer(i).getLeftInset();
                }
            }
            return true;
        }
    });
}


我在github中有完整的代码。您可以查看它:

为什么不将
shapedravable
与传递给的自定义
Shape
对象一起使用呢?
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ImageView iv=(ImageView)findViewById(R.id.imageView);
    MyLayerDrawable myLayerDrawable=MyLayerDrawable.Builder.build(getApplicationContext(),R.drawable.layer_d_example);
    MyImageViewPatch myImageViewPatch=new MyImageViewPatch(iv);
    myImageViewPatch.setImageMyLayerDrawable(myLayerDrawable);

}