各位大神,我的问题是这样子的:我制作了一个很简单View,是用来画折线图的。就是墨迹天气的气温折线图。
然后我的view是基于480*800的分辨率下设计的。每个point、line都是找好了坐标点的,然后效果挺好的。并且还做了温度自适应的功能,防止温度值超出view的四周界限。于是我以为大功告成,要提交的时候,我突然反应过来,我是基于480*800的,那么就肯定会有兼容性的问题存在。于是我就在320*480和1280*800下测试,结果都是令人失望的。
我于是去查看网上的方法,说的都是自动适应的。
我的问题便出来了:
1.我设计的view里面的点线都是用px,因为画板里面的方法中定位一个point用的都是px去确定位置。换不成dp的单位;
2.我不想为每一个分辨率做一个新的view,这是十分费时费力的。我将效果图还有工程都全部拷贝上来。请大神给些指导。或者帮我实现一下,然后我在研究。这是在480*800下的效果:
这是在1280*800下的效果:
很明显看见1280*800的整个版面都缩在一块上了。后来xml的布局文件我加上权重后,可以不满。可是折线图的view,就是无法整体变大。效果如下:这张我有做一点点的修改,但是还是可以看出低温折线图还是缩在一块。接下来我把代码拷贝上来:
首先是xml布局:
<?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="match_parent"
android:background="@drawable/www"
android:orientation="vertical" > <RelativeLayout
android:layout_width="match_parent"
android:layout_height="25dip"
android:orientation="horizontal" > <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="温度趋势图"
android:textColor="#FFFFFF" />
</RelativeLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="30dip"
android:layout_gravity="center"
android:orientation="horizontal"
android:textColor="#FFFFFF" > <TextView
android:id="@+id/Sun"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_weight="1"
android:text="周日 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Mon"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周一 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Tues"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周二 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Wed"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周三 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Thur"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周四 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Fri"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周五 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Sat"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周六 "
android:textColor="#FFFFFF" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="25dip"
android:layout_gravity="center"
android:orientation="horizontal"
android:textColor="#FFFFFF" > <TextView
android:id="@+id/one"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/two"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/three"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/four"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/five"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/six"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/seven"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <com.example.weathertrend.TrendView
android:layout_width="wrap_content"
android:layout_height="344dip" >
</com.example.weathertrend.TrendView>
</LinearLayout>
Android自定义view不兼容分辨率不同
然后我的view是基于480*800的分辨率下设计的。每个point、line都是找好了坐标点的,然后效果挺好的。并且还做了温度自适应的功能,防止温度值超出view的四周界限。于是我以为大功告成,要提交的时候,我突然反应过来,我是基于480*800的,那么就肯定会有兼容性的问题存在。于是我就在320*480和1280*800下测试,结果都是令人失望的。
我于是去查看网上的方法,说的都是自动适应的。
我的问题便出来了:
1.我设计的view里面的点线都是用px,因为画板里面的方法中定位一个point用的都是px去确定位置。换不成dp的单位;
2.我不想为每一个分辨率做一个新的view,这是十分费时费力的。我将效果图还有工程都全部拷贝上来。请大神给些指导。或者帮我实现一下,然后我在研究。这是在480*800下的效果:
这是在1280*800下的效果:
很明显看见1280*800的整个版面都缩在一块上了。后来xml的布局文件我加上权重后,可以不满。可是折线图的view,就是无法整体变大。效果如下:这张我有做一点点的修改,但是还是可以看出低温折线图还是缩在一块。接下来我把代码拷贝上来:
首先是xml布局:
<?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="match_parent"
android:background="@drawable/www"
android:orientation="vertical" > <RelativeLayout
android:layout_width="match_parent"
android:layout_height="25dip"
android:orientation="horizontal" > <TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="温度趋势图"
android:textColor="#FFFFFF" />
</RelativeLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="30dip"
android:layout_gravity="center"
android:orientation="horizontal"
android:textColor="#FFFFFF" > <TextView
android:id="@+id/Sun"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="20dip"
android:layout_weight="1"
android:text="周日 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Mon"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周一 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Tues"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周二 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Wed"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周三 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Thur"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周四 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Fri"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周五 |"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/Sat"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:layout_weight="1"
android:text="周六 "
android:textColor="#FFFFFF" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="25dip"
android:layout_gravity="center"
android:orientation="horizontal"
android:textColor="#FFFFFF" > <TextView
android:id="@+id/one"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/two"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/three"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/four"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/five"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/six"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/seven"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <com.example.weathertrend.TrendView
android:layout_width="wrap_content"
android:layout_height="344dip" >
</com.example.weathertrend.TrendView>
</LinearLayout>
Android自定义view不兼容分辨率不同
<LinearLayout
android:layout_width="match_parent"
android:layout_height="25dip"
android:orientation="horizontal" > <TextView
android:id="@+id/onenigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/twonigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/threenigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/fournigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/fivenigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/sixnigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/sevennigth"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="晴"
android:textColor="#FFFFFF" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="25dip"
android:orientation="horizontal"
android:textColor="#FFFFFF" > <TextView
android:id="@+id/onetime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginLeft="20dip"
android:text="01/18"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/twotime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="01/19"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/threetime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="01/20"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/fourtime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="01/21"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/fivetime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="01/22"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/sixtime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="01/23"
android:textColor="#FFFFFF" /> <TextView
android:id="@+id/seventime"
android:layout_width="40dip"
android:layout_height="wrap_content"
android:layout_marginLeft="2dip"
android:text="01/24"
android:textColor="#FFFFFF" />
</LinearLayout></LinearLayout>
package com.example.weathertest1;import android.content.Context;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.util.AttributeSet;import android.view.View;/*
* 这是一个模仿墨迹天气的温度趋势图。
* 其中:
* 1.该view是在分辨率为480*344下计算的
* 2.view距离lift是40px
* 3.每个point的间距是65px
* 4.每個溫度是等份20px(后期实现动态分配)
* */
public class TrendView extends View { private Paint mPaint;
private Paint mPointPaint;
private Paint mTextPaint;
private Paint mLinePaint;
private Paint mbackLinePaint; private Context mContext; static int[] topTem;
static int[] lowTem;
static int topCha = 0;// 用于调整折线图因为温度值不同,导致图像的不美观。(高温)
static int lowCha = 0;// 用于低温的调节 public TrendView(Context context) { super(context); } public TrendView(Context context, AttributeSet attr) { super(context, attr); } @Override
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); mPaint = new Paint(); mbackLinePaint = new Paint();
mbackLinePaint.setColor(Color.WHITE); mPointPaint = new Paint();
mPointPaint.setAntiAlias(true);
mPointPaint.setColor(Color.WHITE); mLinePaint = new Paint();
mLinePaint.setColor(Color.YELLOW);
mLinePaint.setAntiAlias(true);
mLinePaint.setStrokeWidth(3);
mLinePaint.setStyle(Style.FILL); mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setColor(Color.WHITE);
mTextPaint.setTextSize(22F);// 设置温度值的字体大小 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ww0);
// for (int i = 20; i < 440; i += 65) {
// canvas.drawBitmap(bitmap, i, 0f, mPaint); // }
// bitmap = BitmapFactory.decodeResource(getResources(),
// R.drawable.ww1);
// for (int i = 20; i < 440; i += 65) {
// canvas.drawBitmap(bitmap, i, 400f, mPaint); // }
int[] topTem = new int[] { 3, 6, 8, 7, 3, 4, 6 };
int[] lowTem = new int[] { -2, -2, 2, -1, -3, -2, -2 };
int top = 10;
int low = -10;
float space = 0f;
float space1 = 0f;
int temspace = 300 / 30;// 等分10px,这样就有30个温度值。 // 更改参数space、space1的加减程度可以实现对曲线的美观调节
for (int i = 0; i < topTem.length; i++) {
space = (top - topTem[i] + topCha) * temspace;// 调节参数
if (i != topTem.length - 1) {
// 增加图片
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ww2);
canvas.drawBitmap(bitmap, 50 + 100 * i, 45 + space, mPaint);// Y轴从45px开始
// 添加温度数值
space1 = (top - topTem[i + 1] + topCha) * temspace;// 调节参数
canvas.drawText(topTem[i] + "°", 50 + 100 * i, 110 + space,
mTextPaint);
canvas.drawLine(50 + 100 * i, 120 + space, 150 + 100 * i,
120 + space1, mLinePaint);
canvas.drawCircle(50 + 100 * i, 120 + space, 5, mPointPaint);
canvas.drawCircle(50 + 100 * (i + 1), 120 + space1, 5,
mPointPaint);
} else {
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ww5);
canvas.drawBitmap(bitmap, 50 + 100 * i, 45 + space, mPaint);// Y轴从45px开始 canvas.drawText(topTem[i] + "°", 50 + 100 * i, 110 + space,
mTextPaint);
} } // 计算夜晚温度的显示位置
for (int i = 0; i < lowTem.length; i++) {
space = (top - lowTem[i] + lowCha) * temspace;// 调节参数
if (i != lowTem.length - 1) {
//
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ww1);
canvas.drawBitmap(bitmap, 22 + 65 * i, 155 + space, mPaint);// Y轴从155dp开始 space1 = (top - lowTem[i + 1] + lowCha) * temspace;// 调节参数
canvas.drawText(lowTem[i] + "°", 30 + 65 * i, 150 + space,
mTextPaint);
canvas.drawLine(40 + 65 * i, 120 + space, 105 + 65 * i,
120 + space1, mLinePaint);
canvas.drawCircle(40 + 65 * i, 120 + space, 5, mPointPaint);
canvas.drawCircle(40 + 65 * (i + 1), 120 + space1, 5,
mPointPaint);
} else {
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ww3);
canvas.drawBitmap(bitmap, 22 + 65 * i, 155 + space, mPaint);// Y轴从155dp开始 canvas.drawText(lowTem[i] + "°", 30 + 65 * i, 150 + space,
mTextPaint);
} } }}
为什么是除以7?我后来的实现方法是,按480与800的比,然后每个参数乘以这个系数比。也就是整体按比例放大。效果还行,只是要新建一个trendView。
我知道要用dp,可是canvas的api中的方法所使用的都是px单位。并且我也不知道各个密度比。