这是一个棘手的问题:
我正在编写自定义ImageView
:
public class CustomImageView extends View
要显示的图片是通过setImagePath(String path)
设置的,BitMap
从assets
文件夹中加载CustomImageView
。这工作得很好,图像尺寸得到验证。
在以后的进度中,LinearLayout
- 对象通过addView(View v)
添加到@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
(与父级匹配)。重写方法
onDraw(Canvas c)
被调用并计算一些疯狂的值,此时没什么重要的。
奇怪的是底值总是零!而且我认为这就是为什么E/CIView﹕ onLayout - changed: true, left: 0, top: 0, right: 1080, bottom: 0
E/CIView﹕ bitmap - bitmapWidth: 735, bitmapHeight: 490
E/CIView﹕ onLayout - changed: false, left: 0, top: 0, right: 1080, bottom: 0
E/CIView﹕ bitmap - bitmapWidth: 735, bitmapHeight: 490
永远不会被调用的原因。
onLayout
有人可以向我解释为什么invalidate()
永远不会得到正确的底值吗?像requestLayout()
或public class MainActivity extends Activity {
ListView lv;
String name[]={"Ankit","Arora","Arun","yadav"};
CustomAdapter obj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.listView1);
obj=new CustomAdapter(MainActivity.this,name,no);
lv.setAdapter(obj);
obj.notifyDataSetChanged();
}
}
这样的方法没有改变任何东西,也许我错过了一些特殊的部分..?
答案 0 :(得分:1)
如果覆盖View
,则需要提供其大小 - 这就是为什么你得到零高度范围的原因。因此,请在onMeasure()
内部实施setMeasuredDimension()
。
E.g。
@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
setMeasuredDimension(bitmapWidth, bitmapHeight);
}
虽然您应该使用
检查是否有足够的空间 MeasureSpec.getSize(widthMeasureSpec)
和
MeasureSpec.getSize(heightMeasureSpec)