gpt4 book ai didi

java - 在低于 23 的 API 中绘制复杂的可绘制对象

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:41 25 4
gpt4 key购买 nike

我正在尝试绘制由圆形和矩形组成的可绘制对象。当 api 设置为 23 时,它工作正常。我注意到在最新的 api 中添加了“项目”的以下属性:高度、重力、重量。老版本的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 的图像:

enter image description here

使用 api 22 的图像:

enter image description here

最佳答案

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

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

一个名为 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;}
}

我创建的第二个类称为 MyImageViewPatch,它拥有一个 ImageView。该类唯一的公共(public)方法是 setImageMyLayerDrawable(MyLayerDrawable layerDrawable)。此方法将可绘制图像设置委托(delegate)给它拥有的 ImageView:

public void setImageMyLayerDrawable(MyLayerDrawable layerDrawable){
imageView.setImageDrawable(layerDrawable);

}

但在调用 setImageDrawable 方法之前,观察者对象已添加到 MyImageViewPatch 构造函数中的 ImageView。在 ImageView 中绘制 Drawable 之前调用此观察者:

        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;
}
});

如您所见,在绘制 MyLayerDrawable 之前,每个图层的边界都根据左侧和顶部插图进行了调整;这是让可绘制对象以正确的尺寸绘制而不是拉伸(stretch)的关键部分。

这是形状 xml 文件:

<?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"
android:top="8dp">
<shape android:shape="rectangle">
<size
android:width="50dp"
android:height="5dp" />
<solid android:color="#125572" />
</shape>
</item>

<item
android:width="20dp"
android:height="20dp">
<shape android:shape="oval">
<solid android:color="#125572" />
<size
android:width="20dp"
android:height="20dp" />
</shape>
</item>


</layer-list>

为了使矩形垂直居中,我使用了 android:top="8dp"而不是 android:gravity="center_vertical"。

这是主要 Activity 的代码:

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);

}

我在github中有完整的代码。您可以查看:https://github.com/marcosbses/my_layout_drawable.git

关于java - 在低于 23 的 API 中绘制复杂的可绘制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32765470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com