解决方案 »

  1.   

    简单啊,Android的2D API很丰富的
      

  2.   

    你去看《Android游戏开发大全》里面就有,而且还有源码。我正在看,倒是可以画出来,就是不想写,等我有空了写给你看。
      

  3.   

    先声明我是用Android Studio 0.4.6做的,这东西按Tab键能自动把代码补齐,所以比较适合手残党,就是反应有点慢。下面这个Class是主要实现的Class:
    package com.ak.myapplication2.app;//蓝色部分换成你的包在的位置
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;/**
     * Created by Administrator on 14-4-11.
     */
    public class AWP extends View{
        public AWP(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        protected void onDraw(Canvas canvas){
            super.onDraw(canvas);
            canvas.drawColor(Color.BLACK);//设置背景颜色
            Paint paint=new Paint();
            paint.setColor(Color.BLUE);
            for(int i=0;i<100;i++){
                canvas.drawPoint(i,i,paint);//这就是画布Canvas的画点函数,你完全可以在这里用这个函数去画复杂的曲线,只要你的数学好
            }
        }
    }下面是调用上面那个AWP画图函数的布局XML文件main_awp.xml:
    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <com.ak.myapplication2.app.AWP//这里就是刚才那个Class的名字
            android:id="@+id/awp"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </LinearLayout>这里是调用上面那个布局XML文件main_awp.xml的Class:
    package com.ak.myapplication2.app;import android.app.Activity;
    import android.os.Bundle;/**
     * Created by Administrator on 14-4-11.
     */
    public class MainAWP extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.awp_main);//这里的awp_main就是上面那个xml文件的名称
        }
    }下面是的布局文件AndroidManifest.xml调用上面的那个主Class MainAWP:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.ak.myapplication2.app" >    <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.ak.myapplication2.app.MainAWP"//这里就是上面那个主Class
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application></manifest>
    没了。
      

  4.   

    这是主要部分(第一部分)修改后的代码。
    我的手机是1080*1920像素的,所以我把W和H分别设成了1080和1800:
    package com.ak.myapplication2.app;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;/**
     * Created by Administrator on 14-4-11.
     */
    public class AWP extends View{
        float L=0,U=0,W=1080,H=1800,Ox=L+W/2,Oy=U+H/2;//左,上,宽,高,原点在画布上的x坐标,原点在画布上的y坐标
        public AWP(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        protected void onDraw(Canvas canvas){
            super.onDraw(canvas);
            Paint paint=new Paint();
            paint.setARGB(255,175,175,175);
            drawGrid(canvas, paint, 0.4f, 0.1f,2*(float)Math.PI,2);
            paint.setARGB(255,255,0,0); 
            for(float x=-2f*(float)Math.PI;x<2f*(float)Math.PI;x+=0.001){
                drawPoint(canvas, paint, x,(float)Math.sin(x),2*(float)Math.PI,2);
            }
        }
        //使用像素点单位画网格
        private void drawGrid(Canvas canvas,Paint paint,float dx,float dy){
            float x=Ox,y=Oy;
            while (x>L){
                canvas.drawLine(x,U,x,U+H,paint);
                x-=dx;
            }
            x=Ox;
            while (x<L+W){
                canvas.drawLine(x,U,x,U+H,paint);
                x+=dx;
            }        while (y>U){
                canvas.drawLine(L,y,L+W,y,paint);
                y-=dy;
            }
            y=Oy;
            while (y<U+H){
                canvas.drawLine(L,y,L+W,y,paint);
                y+=dy;
            }
            paint.setARGB(255,0,0,0);
            x=Ox;
            canvas.drawLine(x,U,x,U+H,paint);
            y=Oy;
            canvas.drawLine(L,y,L+W,y,paint);
        }
        //使用自定义单位画网格。
        private void drawGrid(Canvas canvas,Paint paint,float dx,float dy,float halfWidth,float halfHeight){
            float x=Ox,y=Oy,dpx=dx*W/2f/halfWidth,dpy=dy*H/2f/halfHeight;
            while (x>L){
                canvas.drawLine(x,U,x,U+H,paint);
                x-=dpx;
            }
            x=Ox;
            while (x<L+W){
                canvas.drawLine(x,U,x,U+H,paint);
                x+=dpx;
            }        while (y>U){
                canvas.drawLine(L,y,L+W,y,paint);
                y-=dpy;
            }
            y=Oy;
            while (y<U+H){
                canvas.drawLine(L,y,L+W,y,paint);
                y+=dpy;
            }
            paint.setARGB(255,0,0,0);
            x=Ox;
            canvas.drawLine(x,U,x,U+H,paint);
            y=Oy;
            canvas.drawLine(L,y,L+W,y,paint);
        }
        //像素单位画点
        private void drawPoint(Canvas canvas,Paint paint,float x,float y){
            canvas.drawPoint(x+Ox,Oy-y,paint);
        }
        //自定义单位画点,halfWidth与halfHeight把画布的半宽与半高自定义化。如drawGrid(canvas,paint,0.5f,0.0f,1f,1f)将在X轴的右半部分的一半处画一个点
        private void drawPoint(Canvas canvas,Paint paint,float x,float y,float halfWidth,float halfHeight){
            drawPoint(canvas,paint,W/2f/halfWidth*x,H/2f/halfHeight*y);
        }
    }
    这是调试时的手机屏幕截图:
      

  5.   

    我在网上找了歌DEMO,但是曲线的title无法显示,  不知道为什么,求大神解答啊
    package com.viziner.minecoal.ui.activitys;import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Random;
    import java.util.Timer;import org.achartengine.ChartFactory;
    import org.achartengine.GraphicalView;
    import org.achartengine.chart.PointStyle;
    import org.achartengine.model.TimeSeries;
    import org.achartengine.model.XYMultipleSeriesDataset;
    import org.achartengine.model.XYSeries;
    import org.achartengine.renderer.XYMultipleSeriesRenderer;
    import org.achartengine.renderer.XYSeriesRenderer;
    import org.androidannotations.annotations.AfterViews;
    import org.androidannotations.annotations.Bean;
    import org.androidannotations.annotations.EActivity;
    import org.androidannotations.annotations.Extra;
    import org.androidannotations.annotations.ViewById;
    import org.androidannotations.annotations.WindowFeature;import android.content.Intent;
    import android.graphics.Color;
    import android.util.Log;
    import android.view.Window;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.LinearLayout;import com.viziner.minecoal.R;
    import com.viziner.minecoal.listener.TitleClickListener;
    import com.viziner.minecoal.rest.Tools;
    import com.viziner.minecoal.ui.viewgroup.TitleView;
    import com.viziner.minecoal.ui.views.MyChartView;@EActivity(R.layout.qu_xian_3)
    @WindowFeature(value = { Window.FEATURE_NO_TITLE,
    Window.FEATURE_INDETERMINATE_PROGRESS })
    public class QuXian_3_Activity extends BaseActivity implements
    TitleClickListener { @ViewById
    TitleView title; private GraphicalView chart;

    @Extra
    String[] time, data;

    Double[] datas; /** 曲线数量 */
    private static final int SERIES_NR = 1;
    private TimeSeries series1;
    private XYMultipleSeriesDataset dataset1; /** 时间数据 */
    Date[] xcache = new Date[20];
    /** 数据 */
    int[] ycache = new int[20];

    double max, min; @Override
    public void backClick() {
    finish();
    } @Override
    public void otherClick() {
    if (!networkStatusOK(this)) {
    showTextToast("网络未连接!");
    return;
    }
    startActivityForResult(new Intent(this, QuXianSheZhiActivity_.class),
    200);
    } @AfterViews
    void afterview() {
    title.setTitle("数据曲线");
    title.titleType(TitleView.TYPE.BOTH_BTN);
    title.setButton2Src(R.drawable.set_bg);
    title.setListener(this);
    LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout);
    datas = new Double[data.length];
    for (int i = 0; i < data.length; i++){
    datas[i] = Double.valueOf(data[i]);
    }
    max = datas[0];
    for (int i = 0; i < datas.length; i++){
    if (datas[i] > max){
    max = datas[i];
    }
    }
    min = datas[0];
    for (int i = 0; i < datas.length; i++){
    if (datas[i] < min){
    min = datas[i];
    }
    }

    chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(max, min), "HH:mm");
    layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT, 900)); }

      private XYMultipleSeriesRenderer getDemoRenderer(double maxX, double minX) {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();     renderer.setChartTitleTextSize(20);

        renderer.setAxisTitleTextSize(16);
        renderer.setAxesColor(Color.YELLOW);
        renderer.setLabelsTextSize(35);    //数轴刻度字体大小
        renderer.setLabelsColor(Color.BLACK);
        renderer.setLegendTextSize(15);    //曲线说明
        renderer.setXLabelsColor(Color.WHITE);
        renderer.setYLabelsColor(0,Color.WHITE);
        renderer.setShowLegend(false);
        renderer.setMargins(new int[] {20, 30, 100, 0});
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(Color.GREEN);
        r.setChartValuesTextSize(15);
        r.setChartValuesSpacing(3);
        r.setPointStyle(PointStyle.CIRCLE);
        r.setFillBelowLine(true);
        r.setFillBelowLineColor(0xffffff);
        r.setFillPoints(true);
        renderer.addSeriesRenderer(r);
        renderer.setMarginsColor(0xffffff);
        renderer.setShowGrid(true);
        renderer.setYAxisMax(maxX * 1.1);
        renderer.setYAxisMin(minX * 1.1);
        renderer.setXLabels(6);
        renderer.setInScroll(true);  //调整大小
        renderer.setPanEnabled(true, true);
        return renderer;
      }
       /**
        * 数据对象
        * @return
        */
       private XYMultipleSeriesDataset getDateDemoDataset() {
        dataset1 = new XYMultipleSeriesDataset();
        final int nr = 60;
    //     long value = new Date().getTime();
    //     Random r = new Random();
        Calendar c = Calendar.getInstance();
        
        for (int i = 0; i < SERIES_NR; i++) {
          series1 = new TimeSeries("Demo" + (i + 1));
    //       for (int k = 0; k < nr; k++) {
    //         series1.add(new Date(value - 60000 * 60 +k*1000*60), 20 +r.nextInt() % 10);
          for (int k = 0; k < time.length; k++) {
         try {
    c.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse(time[k]));
    } catch (ParseException e) {
    e.printStackTrace();
    Log.e("err", e.getMessage());
    }        
         series1.add(new Date(c.getTimeInMillis()+33000), datas[k]);
          }
          dataset1.addSeries(series1);
        }
        return dataset1;
      }
    }
      

  6.   

    我有demo    今天刚下的  csdn   上面有  和你说的需求差不多
      

  7.   

    package com.example.mycharttest;
    import java.util.Date;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;import org.achartengine.ChartFactory;
    import org.achartengine.GraphicalView;
    import org.achartengine.chart.PointStyle;
    import org.achartengine.model.TimeSeries;
    import org.achartengine.model.XYMultipleSeriesDataset;
    import org.achartengine.renderer.XYMultipleSeriesRenderer;
    import org.achartengine.renderer.XYSeriesRenderer;import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;public class RtChartsActivity extends Activity {

    private Timer timer = new Timer();
        private GraphicalView chart;
        private TextView textview;
        private TimerTask task;
        private int addY = -1;
    private long addX;
    /**«˙œfl ˝¡ø*/
        private static final int SERIES_NR=1;
        private static final String TAG = "message";
        private TimeSeries series1;
        private XYMultipleSeriesDataset dataset1;
        private Handler handler;
        private Random random=new Random();
        
        /** ±º‰ ˝æ›*/
        Date[] xcache = new Date[20];
    /** ˝æ›*/
        int[] ycache = new int[20]; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rtchart);
    LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout);
            //…˙≥…Õº±Ì
    chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "hh:mm:ss");
    layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT,380));
    //Œ™TextViewÃ̺” ¬º˛
    textview = (TextView)findViewById(R.id.myview);
    textview.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
    Toast.makeText(RtChartsActivity.this, "ceshiview", 1).show();
    Intent intent = new Intent();
    intent.setClass(RtChartsActivity.this, MainActivity.class);
    startActivity(intent);
    }
    });

    handler = new Handler() {
             @Override
             public void handleMessage(Message msg) {
             //À¢–¬Õº±Ì
             updateChart();
             super.handleMessage(msg);
             }
            };
            task = new TimerTask() {
             @Override
             public void run() {
             Message message = new Message();
                 message.what = 200;
                 handler.sendMessage(message);
             }
            };
            timer.schedule(task, 2*1000,1000);
    }

       private void updateChart() {
        //…Ë∂®≥§∂»Œ™20
        int length = series1.getItemCount();
        if(length>=20) length = 20;
        addY=random.nextInt()%10;
        addX=new Date().getTime();
        
        //Ω´«∞√ʵƒµ„∑≈»Îª∫¥Ê
    for (int i = 0; i < length; i++) {
    xcache[i] =  new Date((long)series1.getX(i));
    ycache[i] = (int) series1.getY(i);
    }
        
    series1.clear();
    //Ω´–¬≤˙…˙µƒµ„ ◊œ»º”»ÎµΩµ„ºØ÷–£¨»ª∫Û‘⁄—≠ª∑ÃÂ÷–Ω´◊¯±Í±‰ªª∫Ûµƒ“ªœµ¡–µ„∂º÷ÿ–¬º”»ÎµΩµ„ºØ÷–
    //’‚¿Ôø…“‘ ‘—È“ªœ¬∞—À≥–Úµflµππ˝¿¥ « ≤√¥–ßπ˚£¨º¥œ»‘À––—≠ª∑㨑ŸÃ̺”–¬≤˙…˙µƒµ„
    series1.add(new Date(addX), addY);
    for (int k = 0; k < length; k++) {
         series1.add(xcache[k], ycache[k]);
         }
    //‘⁄ ˝æ›ºØ÷–Ã̺”–¬µƒµ„ºØ
    dataset1.removeSeries(series1);
    dataset1.addSeries(series1);
    //«˙œfl∏¸–¬
    chart.invalidate();
        }
    /**
     * …Ë∂®»Á±Ì—˘ Ω
     * @return
     */
       private XYMultipleSeriesRenderer getDemoRenderer() {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        renderer.setChartTitle(" µ ±«˙œfl");//±ÍÂ
        renderer.setChartTitleTextSize(20);
        renderer.setXTitle(" ±º‰");    //x÷·Àµ√˜
        renderer.setAxisTitleTextSize(16);
        renderer.setAxesColor(Color.BLACK);
        renderer.setLabelsTextSize(15);    // ˝÷·øÃ∂»◊÷ÃÂ¥Û–°
        renderer.setLabelsColor(Color.BLACK);
        renderer.setLegendTextSize(15);    //«˙œflÀµ√˜
        renderer.setXLabelsColor(Color.BLACK);
        renderer.setYLabelsColor(0,Color.BLACK);
        renderer.setShowLegend(false);
        renderer.setMargins(new int[] {20, 30, 100, 0});
        XYSeriesRenderer r = new XYSeriesRenderer();
        r.setColor(Color.BLUE);
        r.setChartValuesTextSize(15);
        r.setChartValuesSpacing(3);
        r.setPointStyle(PointStyle.CIRCLE);
        r.setFillBelowLine(true);
        r.setFillBelowLineColor(Color.WHITE);
        r.setFillPoints(true);
        renderer.addSeriesRenderer(r);
        renderer.setMarginsColor(Color.WHITE);
        renderer.setPanEnabled(false,false);
        renderer.setShowGrid(true);
        renderer.setYAxisMax(50);
        renderer.setYAxisMin(-30);
        renderer.setInScroll(true);  //µ˜’˚¥Û–°
        return renderer;
      }
       /**
        *  ˝æ›∂‘œÛ
        * @return
        */
       private XYMultipleSeriesDataset getDateDemoDataset() {
        dataset1 = new XYMultipleSeriesDataset();
        final int nr = 10;
        long value = new Date().getTime();
        Random r = new Random();
        for (int i = 0; i < SERIES_NR; i++) {
          series1 = new TimeSeries("Demo series " + (i + 1));
          for (int k = 0; k < nr; k++) {
            series1.add(new Date(value+k*1000), 20 +r.nextInt() % 10);
          }
          dataset1.addSeries(series1);
        }
        Log.i(TAG, dataset1.toString());
        return dataset1;
      }
        @Override
        public void onDestroy() {
         //µ±Ω· ¯≥Öڠ±πÿµÙTimer
         timer.cancel();
         super.onDestroy();
        };
    }