Android 在CustomAdpter项中绘制线(或任何其他内容)
我的应用程序中有自定义适配器,我需要根据一些数字在每个ListView项目中画一条简单的线 我已经阅读了很多相关的教程,但我仍然不知道如何以正确的方式实现它。我对Android和Java还不熟悉,但除了画画,我似乎对Android的一切都很了解。谁能给我一些建议,让我得到它 编辑: 以下是我现在使用的一些代码: 在单项目布局(row.xml)中,我有ImageView:Android 在CustomAdpter项中绘制线(或任何其他内容),android,android-canvas,draw,custom-adapter,Android,Android Canvas,Draw,Custom Adapter,我的应用程序中有自定义适配器,我需要根据一些数字在每个ListView项目中画一条简单的线 我已经阅读了很多相关的教程,但我仍然不知道如何以正确的方式实现它。我对Android和Java还不熟悉,但除了画画,我似乎对Android的一切都很了解。谁能给我一些建议,让我得到它 编辑: 以下是我现在使用的一些代码: 在单项目布局(row.xml)中,我有ImageView: <ImageView android:id="@+id/chart" android:layout_wi
<ImageView
android:id="@+id/chart"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
我遇到的问题是如何将自定义视图放在图像视图(或任何其他容器)中。您可以在布局中添加一个
视图来绘制线条,并从适配器更改其颜色/宽度
<View
android:id="@+id/chart"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
和在适配器中
class MyAdapter extends ArrayAdapter<Integer> {
private Context context;
MyAdapter(Context context, Integer[] numbers) {
super(context, R.layout.your_layout, numbers);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context)
.inflate(R.layout.your_layout, parent, false);
holder = new ViewHolder();
holder.lineView = convertView.findViewById(R.id.chart);
convertView.setTag(holder);
}
else {
holder = convertView.getTag();
}
int number = getItem(position);
// Calculate width based on your number. Must be in px
ViewGroup.LayoutParams params = holder.lineView.getLayoutParams();
params.width = calculatedWidth;
// Calculate color based on your number
int color = Color.rgb(r, g, b);
holder.lineView.setBackroundColor(color);
}
private class ViewHolder {
View lineView;
}
}
class MyAdapter扩展了ArrayAdapter{
私人语境;
MyAdapter(上下文,整数[]数字){
super(上下文,R.layout.your_布局,数字);
this.context=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=LayoutInflater.from(上下文)
.充气(R.layout.your_布局,parent,false);
holder=新的ViewHolder();
holder.lineView=convertView.findViewById(R.id.chart);
convertView.setTag(支架);
}
否则{
holder=convertView.getTag();
}
int number=getItem(位置);
//根据您的数字计算宽度。必须以px为单位
ViewGroup.LayoutParams params=holder.lineView.getLayoutParams();
params.width=计算宽度;
//根据您的数字计算颜色
int color=color.rgb(r,g,b);
holder.lineView.setBackroundColor(颜色);
}
私有类视窗持有者{
视图线条视图;
}
}
您可以试试这个
public class MyImageView extends ImageView{
private Paint mPaint;
private float cx, cy;
private int size;
public MyImageView(Context context) {
super(context);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(20);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(0, 0, size, size, mPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
super.onSizeChanged(w, h, oldw, oldh);
cx = w/2;
cy = h/2;
///calculate the size of the view here.
size = Math.min(w, h);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(size, size);
}
}
你能再多说一些细节吗。数字是如何决定线条的?在每个listview项目之间画线的方式是否根据它是哪个项目而改变?另外,如果您可以发布一些您当前正在做的事情的代码,我可以提供更多帮助。在文章中添加了一些代码。实际上,我有一个带有数组字段的自定义类,所以理想情况下,我想根据这些数字画一条线。但我需要了解如何在视图中绘制(因为我现在不知道)。自定义视图是否总是相同大小,只是线数不同?假设它是基于少数数字(我的类数组属性将是坐标)的尽可能简单的图表。所以每个列表的大小都是一样的,里面有不同的行。我仍然不明白在这种情况下画画是如何工作的,我觉得自己像个白痴。@Vla你似乎想画斜线。这种方法不适用于这种情况。试试开发者保罗的答案。
public class MyImageView extends ImageView{
private Paint mPaint;
private float cx, cy;
private int size;
public MyImageView(Context context) {
super(context);
init();
}
private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(20);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(0, 0, size, size, mPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldW, int oldH) {
super.onSizeChanged(w, h, oldw, oldh);
cx = w/2;
cy = h/2;
///calculate the size of the view here.
size = Math.min(w, h);
}
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(size, size);
}
}