Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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
Android 如何使用浮点值动态创建矩形形状?_Android_Android View_Android Canvas_Android Graphics - Fatal编程技术网

Android 如何使用浮点值动态创建矩形形状?

Android 如何使用浮点值动态创建矩形形状?,android,android-view,android-canvas,android-graphics,Android,Android View,Android Canvas,Android Graphics,我想通过使用来自服务器的浮点值动态创建矩形形状。形状应该是精确的,如果任何一个值是25.2,另一个值是25.3,那么25.3应该看起来更大,就像我们在图表中看到的那样。那么,有什么办法可以实现这一点呢?图为: 我试图使用以下方法更改视图大小: itemView.tv_value.layoutParams = LinearLayout.LayoutParams(width,height) 但这似乎只接受整数值,如果使用double将float转换为int,那么它将四舍五入到最接近的数字,并且不

我想通过使用来自服务器的浮点值动态创建矩形形状。形状应该是精确的,如果任何一个值是25.2,另一个值是25.3,那么25.3应该看起来更大,就像我们在图表中看到的那样。那么,有什么办法可以实现这一点呢?图为:

我试图使用以下方法更改视图大小:

itemView.tv_value.layoutParams = LinearLayout.LayoutParams(width,height)
但这似乎只接受整数值,如果使用double将float转换为int,那么它将四舍五入到最接近的数字,并且不起作用


如何通过使用画布或视图来实现这一点?

首先,任何视图的
宽度
高度
都不能是
浮动

您可以根据屏幕的像素和浮点值的比率设置
int

适配器生成图形的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:layout_marginLeft="5dp"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="0.8"
        android:layout_height="wrap_content"
        android:minHeight="50dp"
        android:orientation="vertical"
        android:gravity="center_vertical|center_horizontal|left"
        android:id="@+id/lo_dynamic_view_container">

    </LinearLayout>

    <TextView
        android:id="@+id/tv_chart_value"
        android:layout_width="0dp"
        android:layout_weight="0.2"
        android:minHeight="50dp"
        android:textColor="#000"
        android:gravity="center_horizontal|center_vertical"
        android:layout_height="match_parent"/>
</LinearLayout>
结合活动和适配器计算

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;

ArrayList<Data> listData = new ArrayList<>();
BarChartAdapter barChartAdapter;

int[] colors = {Color.GREEN, Color.CYAN, Color.MAGENTA, Color.RED };


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

    recyclerView = findViewById(R.id.rv_bar_chart);

    listData.add(new Data(8.0f,Color.GREEN));
    listData.add(new Data(4.0f,Color.CYAN));
    listData.add(new Data(2.0f,Color.MAGENTA));

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    barChartAdapter = new BarChartAdapter(listData);
    recyclerView.setAdapter(barChartAdapter);
}

public class BarChartAdapter extends RecyclerView.Adapter<BarChartAdapter.MyViewHolder> {

    ArrayList<Data> listData = new ArrayList<>();

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView textView;
        LinearLayout layout;
        public MyViewHolder(View v) {
            super(v);
            textView = v.findViewById(R.id.tv_chart_value);
            layout = (LinearLayout) v.findViewById(R.id.lo_dynamic_view_container);
        }
    }

    public BarChartAdapter(ArrayList<Data> listData) {
        this.listData = listData;
    }


    @Override
    public BarChartAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        View v = (View) LayoutInflater
                .from(parent.getContext())
                .inflate(R.layout.barchart_layout, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.setIsRecyclable(false);
        holder.textView.setText(listData.get(position).value+"");

        Display display = getWindowManager().getDefaultDisplay();
        int width = display.getWidth();
        width = width - (100/width)*80;

        LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);

        TextView tv = new TextView(MainActivity.this);
        tv.setLayoutParams(lparams);
        tv.setWidth((int) Math.floor( getRatio(width, listData.get(position).value,getHighestValue(listData))));
        float redious [] = { 0, 0, 8.3f, 8.5f, 8.2f, 8.9f, 0, 0 };
        ShapeDrawable shape = new ShapeDrawable (new RoundRectShape(redious,null,null));
        shape.getPaint().setColor(listData.get(position).color);

        //shape.getPaint().setColor(colors[new Random().nextInt((colors.length-1) - 0 + 1) + 0]);
        //shape.getPaint().setColor(Color.GREEN);

        tv.setBackground(shape);
        holder.layout.addView(tv);

    }

    @Override
    public int getItemCount() {
        return listData.size();
    }
}



private float getRatio(int width, float value, float highestValue){
    float result = 0;
    result = ( (float)width/highestValue) * value;
    Log.e("Result", "width: "+ width +" "+(int) Math.floor(result)+"");
    return result;
}

private float getHighestValue(ArrayList<Data> listData){
    float result = 0.0f;

    if(listData!=null){
        if(listData.size()>0){
            for (int i = 0; i < listData.size(); i++) {
                result = listData.get(i).value>result?listData.get(i).value:result;
            }
        }
    }
    return result;
}


class Data{
    float value;
    int color;

    public Data(float value, int color) {
        this.value = value;
        this.color = color;
    }
}
}
public类MainActivity扩展了AppCompatActivity{
回收视图回收视图;
ArrayList listData=新的ArrayList();
条形图适配器;
int[]colors={Color.GREEN,Color.CYAN,Color.洋红,Color.RED};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.rv\U条形图);
添加(新数据(8.0f,颜色.GREEN));
添加(新数据(4.0f,Color.CYAN));
添加(新数据(2.0f,颜色.品红色));
LinearLayoutManager layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
barChartAdapter=新的barChartAdapter(listData);
recyclerView.setAdapter(条形图适配器);
}
公共类BarChartAdapter扩展了RecyclerView.Adapter{
ArrayList listData=新的ArrayList();
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图文本视图;
线性布局;
公共MyViewHolder(视图v){
超级(五);
textView=v.findviewbyd(R.id.tv\u图表\u值);
布局=(线性布局)v.findViewById(R.id.lo\u动态视图\u容器);
}
}
公共条形图适配器(ArrayList listData){
this.listData=listData;
}
@凌驾
public BarChartAdapter.MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=(视图)布局展开器
.from(parent.getContext())
.充气(R.layout.barchart_布局,父级,假);
MyViewHolder vh=新的MyViewHolder(v);
返回vh;
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
holder.setIsRecyclable(假);
holder.textView.setText(listData.get(position.value+);
Display Display=getWindowManager().getDefaultDisplay();
int width=display.getWidth();
宽度=宽度-(100/宽度)*80;
LinearLayout.LayoutParams lparams=新的LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_内容,
LinearLayout.LayoutParams.WRAP_内容);
TextView tv=新的TextView(MainActivity.this);
设置布局参数(lparams);
setWidth((int)Math.floor(getRatio(width,listData.get(position.value,getHighestValue,listData)));
浮动半径[]={0,0,8.3f,8.5f,8.2f,8.9f,0,0};
ShapeDrawable shape=新的ShapeDrawable(新的RoundRectShape(径向、空、空));
shape.getPaint().setColor(listData.get(position.color));
//shape.getPaint().setColor(colors[new Random().nextInt((colors.length-1)-0+1)+0]);
//shape.getPaint().setColor(Color.GREEN);
电视背景(形状);
支架。布局。添加视图(电视);
}
@凌驾
public int getItemCount(){
返回listData.size();
}
}
私有浮点getRatio(整数宽度、浮点值、浮点最高值){
浮动结果=0;
结果=((浮动)宽度/最高值)*值;
Log.e(“结果”,“宽度:“+width++”(int)Math.floor(结果)+”);
返回结果;
}
私有浮点getHighestValue(ArrayList listData){
浮动结果=0.0f;
如果(listData!=null){
如果(listData.size()>0){
对于(int i=0;iresult?listData.get(i).value:result;
}
}
}
返回结果;
}
类数据{
浮动值;
内色;
公共数据(浮点值、整型颜色){
这个值=值;
这个颜色=颜色;
}
}
}
截屏


首先,任何视图的
宽度
高度
都不能是
浮动

您可以根据屏幕的像素和浮点值的比率设置
int

适配器生成图形的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="50dp"
    android:layout_marginLeft="5dp"
    android:orientation="horizontal">

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="0.8"
        android:layout_height="wrap_content"
        android:minHeight="50dp"
        android:orientation="vertical"
        android:gravity="center_vertical|center_horizontal|left"
        android:id="@+id/lo_dynamic_view_container">

    </LinearLayout>

    <TextView
        android:id="@+id/tv_chart_value"
        android:layout_width="0dp"
        android:layout_weight="0.2"
        android:minHeight="50dp"
        android:textColor="#000"
        android:gravity="center_horizontal|center_vertical"
        android:layout_height="match_parent"/>
</LinearLayout>
结合活动和适配器计算

public class MainActivity extends AppCompatActivity {

RecyclerView recyclerView;

ArrayList<Data> listData = new ArrayList<>();
BarChartAdapter barChartAdapter;

int[] colors = {Color.GREEN, Color.CYAN, Color.MAGENTA, Color.RED };


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

    recyclerView = findViewById(R.id.rv_bar_chart);

    listData.add(new Data(8.0f,Color.GREEN));
    listData.add(new Data(4.0f,Color.CYAN));
    listData.add(new Data(2.0f,Color.MAGENTA));

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    barChartAdapter = new BarChartAdapter(listData);
    recyclerView.setAdapter(barChartAdapter);
}

public class BarChartAdapter extends RecyclerView.Adapter<BarChartAdapter.MyViewHolder> {

    ArrayList<Data> listData = new ArrayList<>();

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView textView;
        LinearLayout layout;
        public MyViewHolder(View v) {
            super(v);
            textView = v.findViewById(R.id.tv_chart_value);
            layout = (LinearLayout) v.findViewById(R.id.lo_dynamic_view_container);
        }
    }

    public BarChartAdapter(ArrayList<Data> listData) {
        this.listData = listData;
    }


    @Override
    public BarChartAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
        View v = (View) LayoutInflater
                .from(parent.getContext())
                .inflate(R.layout.barchart_layout, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.setIsRecyclable(false);
        holder.textView.setText(listData.get(position).value+"");

        Display display = getWindowManager().getDefaultDisplay();
        int width = display.getWidth();
        width = width - (100/width)*80;

        LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT);

        TextView tv = new TextView(MainActivity.this);
        tv.setLayoutParams(lparams);
        tv.setWidth((int) Math.floor( getRatio(width, listData.get(position).value,getHighestValue(listData))));
        float redious [] = { 0, 0, 8.3f, 8.5f, 8.2f, 8.9f, 0, 0 };
        ShapeDrawable shape = new ShapeDrawable (new RoundRectShape(redious,null,null));
        shape.getPaint().setColor(listData.get(position).color);

        //shape.getPaint().setColor(colors[new Random().nextInt((colors.length-1) - 0 + 1) + 0]);
        //shape.getPaint().setColor(Color.GREEN);

        tv.setBackground(shape);
        holder.layout.addView(tv);

    }

    @Override
    public int getItemCount() {
        return listData.size();
    }
}



private float getRatio(int width, float value, float highestValue){
    float result = 0;
    result = ( (float)width/highestValue) * value;
    Log.e("Result", "width: "+ width +" "+(int) Math.floor(result)+"");
    return result;
}

private float getHighestValue(ArrayList<Data> listData){
    float result = 0.0f;

    if(listData!=null){
        if(listData.size()>0){
            for (int i = 0; i < listData.size(); i++) {
                result = listData.get(i).value>result?listData.get(i).value:result;
            }
        }
    }
    return result;
}


class Data{
    float value;
    int color;

    public Data(float value, int color) {
        this.value = value;
        this.color = color;
    }
}
}
public类MainActivity扩展了AppCompatActivity{
回收视图回收视图;
ArrayList listData=新的ArrayList();
条形图适配器;
int[]colors={Color.GREEN,Color.CYAN,Color.洋红,Color.RED};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.rv\U条形图);
添加(新数据(8.0f,颜色.GREEN));
添加(新数据(4.0f,Color.CYAN));
添加(新数据(2.0f,颜色.品红色));
LinearLayoutManager layoutManager=新的LinearLayoutManager(此);
recyclerView.setLayoutManager(layoutManager);
barChartAdapter=新的barChartAdapter(listData);
recyclerView.setAdapter(条形图适配器);
}
公共类BarChartAdapter扩展了RecyclerView.Adapter{
ArrayList listData=新的ArrayList();
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图文本视图;
线性布局;
公共MyViewHolder(视图v){
s