1. 程式人生 > >動態畫折線圖,暫停與繼續

動態畫折線圖,暫停與繼續

最近要做一個頻道搜尋時的動態波浪形的UI,百度了很多,總結一下,寫了個Demo,實現動態折線圖的暫停與繼續。

佈局檔案:Fragemt_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="cn.hy.linechart.MainActivity$PlaceholderFragment" >


    <LinearLayout
        android:id="@+id/draw_line_chart"
        android:layout_width="match_parent"
        android:layout_height="300dip"
        android:orientation="vertical" >
    </LinearLayout>


    <Button
        android:id="@+id/btn_ok"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/draw_line_chart"
        android:layout_below="@+id/draw_line_chart"
        android:layout_marginTop="32dp"
        android:text="確定" />


    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_ok"
        android:layout_alignRight="@+id/draw_line_chart"
        android:layout_marginRight="50dp"
        android:text="取消" />


</RelativeLayout>

主介面MianActivity:

public class MainActivity extends Activity {


private DrawChart view;//自定義的檢視  先點隨機點並畫線
private MyTimerTask task;//任務
private Button btnOk;
private Button btnCancel;
private Timer timer;//計時器  用來過一定時間排程任務執行
public TimerHandler timerHandler;//更新介面顯示檢視
LinearLayout layout;//DrawChart的存放區域


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
timerHandler = new TimerHandler();
initView();
view = new DrawChart(this);
view.invalidate();
layout.addView(view);

}
public void initView() {
btnOk = (Button) findViewById(R.id.btn_ok);
btnCancel = (Button) findViewById(R.id.btn_cancel);


btnOk.setOnClickListener(btnListener);
btnCancel.setOnClickListener(btnListener);
layout = (LinearLayout) findViewById(R.id.draw_line_chart);
}


/** 實時更新頻道搜尋的波紋圖 */
private class MyTimerTask extends TimerTask {
@Override
public void run() {
timerHandler.sendEmptyMessage(0);
}
}


OnClickListener btnListener = new OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_ok:
task = new MyTimerTask();
timer = new Timer(true);
timer.schedule(task, 0, 100);
break;
case R.id.btn_cancel:
task.cancel();
break;
}
}
};
// 定義一個handler更新UI
@SuppressLint("HandlerLeak")
public class TimerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
view.invalidate();
}
}
}

DrawChart.java:

public class DrawChart extends View{

private int CHARTH = 200;
private int CHARTW = 600;
private int OFFSET_LEFT = 70;
private int OFFSET_TOP = 20;
private int X_INTERVAL = 10;//線條之間最寬的間距

private List<Point> plist;
public DrawChart(Context context) {
super(context);
plist = new ArrayList<Point>();
//initPlist();
}


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
prepareLine();
drawCurve(canvas);
}

/**畫波紋線條*/
private void drawCurve(Canvas canvas){
Paint paint = new Paint();

paint.setColor(Color.BLACK);
paint.setStrokeWidth(3);
paint.setAntiAlias(true);

if(plist.size() >= 2){
for(int i = 0; i<plist.size()-1; i++){
canvas.drawLine(plist.get(i).x, plist.get(i).y, plist.get(i+1).x, plist.get(i+1).y, paint);//畫線
}
}
}

//準備線條所需要的點
private void prepareLine(){
int py = OFFSET_TOP + (int)(Math.random()*(CHARTH - OFFSET_TOP));//隨機生成點的縱座標位置
Point p = new Point(OFFSET_LEFT + CHARTW , py );//隨機生成點
if(plist.size() > 90){//用來畫線的點的個數
plist.remove(0);//清除第一個點
for(int i = 0; i<89; i++){
if(i == 0) plist.get(i).x -= (X_INTERVAL - 2);
else plist.get(i).x -= X_INTERVAL;
}
plist.add(p);
}
else{
for(int i = 0; i<plist.size()-1; i++){
plist.get(i).x -= X_INTERVAL;
}
plist.add(p);
}
}
}


資源下載:http://download.csdn.net/detail/hongyi787200/7671859