Android 如何使用浮点值动态创建矩形形状?
我想通过使用来自服务器的浮点值动态创建矩形形状。形状应该是精确的,如果任何一个值是25.2,另一个值是25.3,那么25.3应该看起来更大,就像我们在图表中看到的那样。那么,有什么办法可以实现这一点呢?图为: 我试图使用以下方法更改视图大小: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,那么它将四舍五入到最接近的数字,并且不
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