android畫直線
Ⅰ android 如何畫一條線
public class MainActivity extends Activity {
private ImageView iv;
private Bitmap baseBitmap;
private Canvas canvas;
private Paint paint;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.iv = (ImageView) this.findViewById(R.id.iv);
// 創建一張空白圖片
baseBitmap = Bitmap.createBitmap(480, 640, Bitmap.Config.ARGB_8888);
// 創建一張畫布
canvas = new Canvas(baseBitmap);
// 畫布背景為灰色
canvas.drawColor(Color.GRAY);
// 創建畫筆
paint = new Paint();
// 畫筆顏色為紅色
paint.setColor(Color.RED);
// 寬度5個像素
paint.setStrokeWidth(5);
// 先將灰色背景畫上
canvas.drawBitmap(baseBitmap, new Matrix(), paint);
iv.setImageBitmap(baseBitmap);
iv.setOnTouchListener(new OnTouchListener() {
int startX;
int startY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 獲取手按下時的坐標
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
// 獲取手移動後的坐標
int stopX = (int) event.getX();
int stopY = (int) event.getY();
// 在開始和結束坐標間畫一條線
canvas.drawLine(startX, startY, stopX, stopY, paint);
// 實時更新開始坐標
startX = (int) event.getX();
startY = (int) event.getY();
iv.setImageBitmap(baseBitmap);
break;
}
return true;
}
});
}
public void save(View view) {
try {
File file = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
OutputStream stream = new FileOutputStream(file);
baseBitmap.compress(CompressFormat.JPEG, 100, stream);
stream.close();
// 模擬一個廣播,通知系統sdcard被掛載
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment
.getExternalStorageDirectory()));
sendBroadcast(intent);
Toast.makeText(this, "保存圖片成功", 0).show();
} catch (Exception e) {
Toast.makeText(this, "保存圖片失敗", 0).show();
e.printStackTrace();
}
}
}
java">
Ⅱ android下canvas畫的直線怎麼移動
android畫一條動態直線實現思路: 一個主view類(一個自定義view),在主view類中定義了統一的paint、bitmap、canvas,以及子類中需要用到的3個點downPoint,movePoint,upPoint。 其他子類(畫直線的view、畫矩形的view····)都是繼承這個主view類。 在每次選擇形狀的時候: 1、實例化一個view類; 2、將view類加入到當前activity; 畫每一種形狀都是在自己的view上進行,新加進來的view覆蓋前面的view。 每個子類中都有方法onTouchEvent()執行自己的操作; 具體實現代碼; public boolean onTouchEvent(MotionEventevent) { switch(event.getAction()){ caseMotionEvent.ACTION_DOWN: caseMotionEvent.ACTION_MOVE: caseMotionEvent.ACTION_UP: } return true; }
Ⅲ Android開發如何在屏幕對角線顯示一條直線
android畫一條動態直線實現思路:
一個主view類(一個自定義view),在主view類中定義了統一的paint、bitmap、canvas,以及子類中需要用到的3個點downPoint,movePoint,upPoint。
其他子類(畫直線的view、畫矩形的view····)都是繼承這個主view類。
在每次選擇形狀的時候:
1、實例化一個view類;
2、將view類加入到當前activity;
畫每一種形狀都是在自己的view上進行,新加進來的view覆蓋前面的view。
每個子類中都有方法onTouchEvent()執行自己的操作;
具體實現代碼;
public boolean onTouchEvent(MotionEventevent) {
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
caseMotionEvent.ACTION_MOVE:
caseMotionEvent.ACTION_UP:
}
return true;
}
Ⅳ android怎麼在畫板是畫(直線,圓,矩形)
Ⅳ android 中如何畫一條動態的畫一條直線.(即從A到慢慢運動到B點的軌跡,走過後軌跡是一條線)
首先找到這條直線的所有點,然後開啟一個線程循環獲取點,用Handle發送消息去畫線
@Override
public void run() {
try {
for(int i = 0 ; i < myPointList.size(); i++)
{
MyPoint myPoint = myPointList1.get(i);
Message message = Message.obtain();
message.what = 2;
message.obj = myPoint;
mHandler.sendMessage(message);
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Ⅵ android中如何利用view視圖添加一條直線
你好!
步驟1:在你創建的工程中新建一個class文件,隨便起個名字叫MyView吧,打開文件會看到:
public
class
MyView
{
}
步驟2:讓該類繼承
View類,也就是在MyView後面添幾個字母,如:
public
class
MyView
extends
View
{
}
步驟3:在上面的這個類中,寫一個方法:
public
class
MyView
extends
View
{
protected
void
onDraw(Canvas
canvas)
{
..........
}
}
步驟4:在onDrow方法中寫一條語句:
public
class
MyView
extends
View
{
protected
void
onDraw(Canvas
canvas)
{
canvas.drawLine(起點橫坐標,起點縱坐標,終點橫坐標,終點縱坐標,線的顏色);
}
}
註:看到「drawLine」了吧,這就是在畫線。
如有疑問,請追問。
Ⅶ 有沒有辦法在android的layout中畫出來一條線
可以利用TextView來實現,如果要水平線將textView的高設置為1設置背景顏色,豎線將寬設為1。如下代碼:
<TextView
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#ffffff"
/>
Ⅷ Android,畫一條可編輯的直線
要實現這種操作比較復雜。
我跟你說一下思路。
首先畫一條直線繪制到畫布上,
當你手按在那條直線的坐標周圍,改變直線顏色(表示可編輯狀態)
然後手拖動,會產生一個坐標,記錄手釋放的坐標,重新繪制一個相同的直線。(去掉原來的直線)
改變長度的話也是類似,取得改變之後的坐標然後繪制一條直線
Ⅸ 安卓程序中怎樣在控制項的中心點繪制直線
直接在layout裡面寫就可以了:
指定其寬度為 match_parent,
指定其高度為1或2或更大,這個取決於你要多粗的線;
指定其背景色,看你喜好了...
也可以指定paddingLeft, marginTop等屬性(有時候兩邊有點空的線會比沾滿全寬的好看些);
下面是一個示例,畫一條灰色的線:
<View
android:layout_width="match_parent"
android:layout_height="1dip"
android:background="#696969" />
Ⅹ Android中Path類的lineTo方法和quadTo方法畫線的區別
當我們需要在屏幕上形成畫線時,Path類的應用是必不可少的,而Path類的lineTo和quadTo方法實現的繪制線路形式也是不一樣的,下面就以代碼的實現來直觀的探究這兩個方法的功能實現區別;
1. Path--->quadTo(float x1, float y1, float x2, float y2):
該方法的實現是當我們不僅僅是畫一條線甚至是畫弧線時會形成平滑的曲線,該曲線又稱為"貝塞爾曲線"(Bezier curve),其中,x1,y1為控制點的坐標值,x2,y2為終點的坐標值;
貝塞爾曲線的形成,就比如我們把一條橡皮筋拉直,橡皮筋的頭尾部對應起點和終點,然後從拉直的橡皮筋中選擇任意一點(除頭尾對應的點外)扯動橡皮筋形成的彎曲形狀,而那個扯動橡皮筋的點就是控制點;
下就面以一個Demo來結合理解quadTo函數的應用,代碼如下:
1).自定義View:
[java] view plain
package com.feixun.hu.pt;
import android.content.Context;
import android.gesture.GestureStroke;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
public class DrawingWithBezier extends View
{
private float mX;
private float mY;
private final Paint mGesturePaint = new Paint();
private final Path mPath = new Path();
public DrawingWithBezier(Context context)
{
super(context);
mGesturePaint.setAntiAlias(true);
mGesturePaint.setStyle(Style.STROKE);
mGesturePaint.setStrokeWidth(5);
mGesturePaint.setColor(Color.WHITE);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
// TODO Auto-generated method stub
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
touchDown(event);
break;
case MotionEvent.ACTION_MOVE:
touchMove(event);
}
//更新繪制
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas)
{
// TODO Auto-generated method stub
super.onDraw(canvas);
//通過畫布繪制多點形成的圖形
canvas.drawPath(mPath, mGesturePaint);
}
//手指點下屏幕時調用
private void touchDown(MotionEvent event)
{
//mPath.rewind();
//重置繪制路線,即隱藏之前繪制的軌跡
mPath.reset();
float x = event.getX();
float y = event.getY();
mX = x;
mY = y;
//mPath繪制的繪制起點
mPath.moveTo(x, y);
}
//手指在屏幕上滑動時調用
private void touchMove(MotionEvent event)
{
final float x = event.getX();
final float y = event.getY();
final float previousX = mX;
final float previousY = mY;
final float dx = Math.abs(x - previousX);
final float dy = Math.abs(y - previousY);
//兩點之間的距離大於等於3時,生成貝塞爾繪制曲線
if (dx >= 3 || dy >= 3)
{
//設置貝塞爾曲線的操作點為起點和終點的一半
float cX = (x + previousX) / 2;
float cY = (y + previousY) / 2;
//二次貝塞爾,實現平滑曲線;previousX, previousY為操作點,cX, cY為終點
mPath.quadTo(previousX, previousY, cX, cY);
//第二次執行時,第一次結束調用的坐標值將作為第二次調用的初始坐標值
mX = x;
mY = y;
}
}
}
2).MainActivity:
[java] view plain
package com.feixun.hu.pt;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(new MySurfaceView(this));
setContentView(new DrawingWithBezier(this));
//setContentView(new DrawingWithoutBezier(this));
}
}
該Demo實現用戶在手機屏幕上滑動手指時,可根據手指滑動的位置繪制出相應的線條,類似輸入法手勢的繪制,所以代碼中的畫筆Paint命名為mGesturePaint;
比如,我們在屏幕上繪制S這個圖案,則形成的圖案如下:
2. Path--->lineTo(float x, float y) :
該方法實現的僅僅是兩點連成一線的繪制線路,這樣,當我們用這個方法繪制曲線時,缺陷就出來了;下面的例子,同樣還是和上面的Demo差不多,只不過Path調用的是lineTo方法,如下:
1). 自定義View:
[java] view plain
package com.feixun.hu.pt;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.Style;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
public class DrawingWithoutBezier extends View
{
private float mX;
private float mY;
private final Paint mGesturePaint = new Paint();
private final Path mPath = new Path();
public DrawingWithoutBezier(Context context)
{
super(context);
mGesturePaint.setAntiAlias(true);
mGesturePaint.setStyle(Style.STROKE);
mGesturePaint.setStrokeWidth(5);
mGesturePaint.setColor(Color.WHITE);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
// TODO Auto-generated method stub
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
touchDown(event);
break;
case MotionEvent.ACTION_MOVE:
touchMove(event);
}
//更新繪制
invalidate();
return true;
}
@Override
protected void onDraw(Canvas canvas)
{
// TODO Auto-generated method stub
super.onDraw(canvas);
canvas.drawPath(mPath, mGesturePaint);
}
//手指點下屏幕時調用
private void touchDown(MotionEvent event)
{
//mPath.rewind();
mPath.reset();
float x = event.getX();
float y = event.getY();
mX = x;
mY = y;
//mPath繪制的繪制起點
mPath.moveTo(x, y);
}
//手指在屏幕上滑動時調用
private void touchMove(MotionEvent event)
{
final float x = event.getX();
final float y = event.getY();
final float previousX = mX;
final float previousY = mY;
final float dx = Math.abs(x - previousX);
final float dy = Math.abs(y - previousY);
//兩點之間的距離大於等於3時,連接連接兩點形成直線
if (dx >= 3 || dy >= 3)
{
//兩點連成直線
mPath.lineTo(x, y);
//第二次執行時,第一次結束調用的坐標值將作為第二次調用的初始坐標值
mX = x;
mY = y;
}
}
}
2).MainActivity:
[java] view plain
package com.feixun.hu.pt;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//setContentView(new MySurfaceView(this));
//setContentView(new DrawingWithBezier(this));
setContentView(new DrawingWithoutBezier(this));
}
}
同樣地,用該例子繪制S形圖案,形成的圖案如下:
結論 :對比前面quadTo方法繪制的S,lineTo繪制的S在彎曲部分很明顯的不能形成平滑的彎曲,會出現明顯的兩點形成一線的突痕。可能圖片看的不是清楚,自行運行這個Demo,然後在屏幕上繪制彎曲曲線或者圓,對比查看他們的形狀區別就一目瞭然;
3. SurfaceView繪制貝塞爾曲線:
上面的繪制圖案方式都是基於View來繪制,當然,我們也可以結合SurfaceView和Rect來實現繪制貝塞爾曲線,這樣繪制的效果相對會比較好,而且效率也相對較高,畢竟相對SurfaceView而言,在動態繪制點線方面較之View更加出色;