مدیریت کاربران مشترک
بروز خطا
امتیازات دریافتی
LineChartView
نمودار خطی به صورت customView
ابتدا کلاس LineChartView را به پروژه اضافه کنید و سپس هر تعداد که خواستید در فایل xml از اون استفاده کنید و بع از اینکه براش آیدی اختصاص دادین متد setDatas رو براش صدا بزنین و دیتاها رو به صورت ArrayList وارد کنید که مقدار اول اسم متغیر و مقدار دوم ارزش متغیر در نمودار خواهد بود که باید به صورت استرینگ وارد بشه ولی خودش به عدد تبدیل میکنه... ببخشید دیگه در حد بضاعت... با تشکر از آقای آقاجانی بابت ویدیوی Chart
اسنیپ
LineChartViewStartupActivity+
package your.package;
import java.util.ArrayList;
import org.apache.http.message.BasicNameValuePair;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
import android.widget.Toast;
public class LineChartView extends ImageView {
private class Dot {
private int id;
private float x;
private float y;
private long value;
}
private final int CLICK_ACTION_THRESHHOLD = 200;
private boolean selectedCircle;
private int interval;
private float xStep;
private float yStep;
private float width;
private Paint chartPaint;
private Paint textPaint;
private Paint largeLinesPaint;
private Paint smallLinesPaint;
private float min;
private float max;
private float yStepIndex;
private float lastDownX;
private float offsetX;
private ArrayList<BasicNameValuePair> datas = new ArrayList<BasicNameValuePair>();
private ArrayList<Dot> dots = new ArrayList<Dot>();
private int currentDotIndex;
public LineChartView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize();
}
public LineChartView(Context context, AttributeSet attrs) {
super(context, attrs);
initialize();
}
public LineChartView(Context context) {
super(context);
initialize();
}
private void initialize() {
chartPaint = new Paint();
chartPaint.setColor(Color.WHITE);
chartPaint.setAntiAlias(true);
chartPaint.setStyle(Style.FILL_AND_STROKE);
chartPaint.setStrokeWidth(5);
textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setAntiAlias(true);
textPaint.setStyle(Style.FILL);
textPaint.setTextAlign(Align.RIGHT);
textPaint.setTextSize(12);
smallLinesPaint = new Paint();
smallLinesPaint.setColor(Color.LTGRAY);
smallLinesPaint.setAntiAlias(true);
smallLinesPaint.setStyle(Style.FILL);
largeLinesPaint = new Paint();
largeLinesPaint.setColor(Color.LTGRAY);
largeLinesPaint.setAntiAlias(true);
largeLinesPaint.setStyle(Style.FILL_AND_STROKE);
largeLinesPaint.setStrokeWidth(3);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (selectedCircle) {
chartPaint.setStyle(Style.STROKE);
canvas.drawCircle(dots.get(currentDotIndex).x, dots.get(currentDotIndex).y, 12, chartPaint);
chartPaint.setStyle(Style.FILL_AND_STROKE);
}
interval = 100;
xStep = 60F;
yStep = (getHeight() - interval) / ((max / yStepIndex) + 1);
float startXPosition = (offsetX / xStep);
int startXIndex = (int) startXPosition;
width = getWidth();
int possibleRenderCount = (int) (width - interval / xStep);
if (startXIndex < 1) {
startXIndex = 1;
}
int endXIndex = startXIndex + possibleRenderCount + 2;
canvas.drawLine(interval, getHeight() - interval, width, getHeight() - interval, chartPaint);
canvas.drawLine(interval, getHeight() - interval, interval, 0, chartPaint);
for (int i = startXIndex; i < endXIndex; i++) {
canvas.drawLine(interval + (i - 1 - startXPosition) * xStep, 0, interval + (i - 1 - startXPosition) * xStep, getHeight() - interval, largeLinesPaint);
}
int lineNumbers = (int) (max / yStepIndex + 1);
if (lineNumbers < 3) {
for (int i = 1; i <= lineNumbers * 30; i++) {
float lineInterval = yStep / 10;
canvas.drawLine(interval + ( -startXPosition) * xStep, getHeight() - interval - i * lineInterval, width, getHeight() - interval - i * lineInterval, smallLinesPaint);
}
} else if (lineNumbers < 5) {
for (int i = 1; i <= lineNumbers * 5; i++) {
float lineInterval = yStep / 5;
canvas.drawLine(interval + ( -startXPosition) * xStep, getHeight() - interval - i * lineInterval, width, getHeight() - interval - i * lineInterval, smallLinesPaint);
}
}
for (int i = 1; i <= lineNumbers; i++) {
canvas.drawLine(interval + ( -startXPosition) * xStep, getHeight() - interval - i * yStep, width, getHeight() - interval - i * yStep, largeLinesPaint);
}
for (int i = 0; i < datas.size(); i++) {
Dot dot = new Dot();
dot.id = i;
dot.x = interval + ( -startXPosition) * xStep + (i * xStep) + xStep;
dot.y = getHeight() - interval - (yStep * Float.parseFloat(datas.get(i).getValue()) / yStepIndex);
dot.value = Long.parseLong(datas.get(i).getValue());
canvas.drawCircle(dot.x, dot.y, 5, chartPaint);
boolean contains = false;
for (Dot dot0: dots) {
if (dot0.id == dot.id) {
contains = true;
changeValuesOfDot(dot.id, dot.x, dot.y);
break;
} else {
continue;
}
}
if ( !contains) {
dots.add(dot);
}
}
for (int i = 0; i < dots.size() - 1; i++) {
chartPaint.setColor(Color.GREEN);
canvas.drawLine(dots.get(i).x, dots.get(i).y, dots.get(i + 1).x, dots.get(i + 1).y, chartPaint);
}
for (int i = 0; i < datas.size(); i++) {
canvas.save();
canvas.rotate( -90f);
canvas.drawText(datas.get(i).getName(), -getHeight() + interval - 5f, interval + ( -startXPosition) * xStep + ((i + 1) * xStep), textPaint);
canvas.restore();
}
chartPaint.setColor(Color.BLACK);
canvas.drawRect(0, 0, interval - 2.5f, getHeight(), chartPaint);
chartPaint.setColor(Color.WHITE);
for (int i = 0; i <= lineNumbers; i++) {
canvas.drawText((long) (yStepIndex * i) + "", interval - 5f, getHeight() - interval - (i * yStep), textPaint);
}
}
private void changeValuesOfDot(int index, float x, float y) {
dots.get(index).x = x;
dots.get(index).y = y;
}
public void setDatas(ArrayList<BasicNameValuePair> values) {
datas = values;
computeMin();
computeMax();
}
private long lastTouchDown = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
selectedCircle = false;
invalidate();
lastTouchDown = System.currentTimeMillis();
lastDownX = event.getRawX();
break;
case MotionEvent.ACTION_UP:
if (System.currentTimeMillis() - lastTouchDown < CLICK_ACTION_THRESHHOLD) {
for (Dot dot: dots) {
if (dot.x <= event.getX() + 20f && dot.x >= event.getX() - 20f && dot.y <= event.getY() + 20f && dot.y >= event.getY() - 20f) {
selectedCircle = true;
currentDotIndex = dot.id;
invalidate();
Toast.makeText(getContext(), "" + dot.value, Toast.LENGTH_SHORT).show();
break;
}
}
}
break;
case MotionEvent.ACTION_MOVE:
if ((datas.size() * xStep) + interval > width) {
float currentX = event.getRawX();
offsetX += lastDownX - currentX;
if (offsetX < 0) {
offsetX = 0;
}
if (offsetX - xStep > (datas.size() * xStep) + interval - width) {
offsetX -= lastDownX - currentX;
break;
}
lastDownX = currentX;
invalidate();
}
break;
}
return true;
}
private void computeMin() {
min = Float.MAX_VALUE;
for (int i = 0; i < datas.size(); i++) {
if (Float.parseFloat(datas.get(i).getValue()) < min) {
min = Float.parseFloat(datas.get(i).getValue());
}
}
}
private void computeMax() {
max = Float.MIN_VALUE;
for (int i = 0; i < datas.size(); i++) {
if (Float.parseFloat(datas.get(i).getValue()) > max) {
max = Float.parseFloat(datas.get(i).getValue());
}
}
for (float i = 1; i < Float.MAX_VALUE; i = i * 10) {
if (max < i) {
yStepIndex = i / 10f;
break;
}
}
}
}
package your.package;
import java.util.ArrayList;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
public class ActivityStartup extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LineChartView lineChartView = (LineChartView) findViewById(R.id.lineChartView);
ArrayList<BasicNameValuePair> values = new ArrayList<BasicNameValuePair>();
values.add(new BasicNameValuePair("Saipa", "8500"));
values.add(new BasicNameValuePair("Iran khodro", "12400"));
values.add(new BasicNameValuePair("Ford", "15000"));
lineChartView.setDatas(values);
}
}
length : 0
words : 0
lines : 0
حقوق مادی و معنوی تمامی آثار و محتویات عرضه شده در این وب سایت، متعلق به شرکت «فوژان رسانه ایده هوشمند» و پدیدآورندگان آثار بوده و حسب مورد دارای مجوز از مراجع ذی صلاح می باشد.
کپی برداری از مطالب این سایت حتی با ذکر منبع جایز نیست.
ویرایش
پیام