1. 程式人生 > >QGis(三)查詢向量圖層的要素屬性欄位值

QGis(三)查詢向量圖層的要素屬性欄位值

當載入一個向量圖層後,如果要檢視要素的屬性欄位值,則需要實現identity的功能。可以和前面的縮放一樣,新增一個工具欄按鈕:

(1)在MainWindow新增一個變數,並在Qt設計師裡新增Action:

QgsMapToolSelect *mpIdentifyTool;		///<查詢要素
這裡QgsMapToolSelect類繼承自QgsMapTool,後面再列出詳細內容。

(2)然後在初始化函式裡新增:

mpMapToolBar->addAction(ui.mpActionIdentify);
mpIdentifyTool = new QgsMapToolSelect(mainMapCanvas);
mpIdentifyTool->setAction(ui.mpActionIdentify);
(3)新增訊號槽函式連線:
connect(ui.mpActionIdentify, SIGNAL(triggered()), this, SLOT(identifyFeature()));
(4)槽函式實現:
void MainWindow::identifyFeature()
{
	mpIdentifyTool->SetEnable(true);
	mainMapCanvas->setMapTool(mpIdentifyTool);
	ui.mpActionIdentify->setCheckable(true);
	ui.mpActionIdentify->setChecked(true);
	if ( mainMapCanvas->layer(0)->type() == QgsMapLayer::RasterLayer)
	{
		return;
	}
	QgsVectorLayer *pLayer=(QgsVectorLayer *)mainMapCanvas->layer(0);
	mpIdentifyTool->SetSelectLayer(pLayer);
	if ( ui.mpActionIdentify->isChecked())
	{
		pLayer->removeSelection(true);
	}
}
可以看到,基本步驟就跟前面的縮放工具欄一模一樣。但是QgsMapToolSelect不是QgsMapTool自帶的類,需要自定義,QgsMapToolSelect類的定義如下:
class QgsMapToolSelect :
	public QgsMapTool
{
    Q_OBJECT;
public:
	QgsMapToolSelect(QgsMapCanvas *);
	~QgsMapToolSelect(void);
public:
	//設定當前被選擇(活動)的圖層
	void SetSelectLayer(QgsVectorLayer *);
    <span style="white-space:pre">	</span>//過載滑鼠釋放事件函式
	virtual void canvasReleaseEvent(QMouseEvent * e);
	//設定工具狀態
	void SetEnable(bool);
	//得到所有的屬性和屬性值,<屬性1,屬性值1>是QMap的一對值
	QList<QMap<QString, QString>> GetAttributeValue(QgsVectorLayer *layer, QgsFeatureIds selectedFIds);
	void setShowFlag(bool flag);
	IdentifyResultDlg *ResultDlg();
private:
	QgsVectorLayer* pLayer;
	QgsFeatureIds layerSelectedFeatures;
	bool StatusFlag;
	QList<QMap<QString, QString>> list; //儲存選擇後的要素
	bool isShowFlag; ///< 是否在主介面上勾選了shp圖層
	IdentifyResultDlg *mIdentifyResultDlg;
	
private:
    <span style="white-space:pre">	</span>//提取滑鼠位置一定範圍作為選擇區域
	void ExpandSelectRangle(QRect &Rect,QPoint Point);
	//將指定的裝置座標區域轉換成地圖座標區域
	void SetRubberBand(QRect &selectRect,QgsRubberBand *);
	//選擇圖層特徵
        void SetSelectFeatures(QgsGeometry *,bool,bool,bool);
	void SetSelectFeatures(QgsGeometry *,bool);
};

具體函式實現:

#include "qgsmaptoolselect.h"

//構造和解構函式
QgsMapToolSelect::QgsMapToolSelect(QgsMapCanvas *Mapcanvas):QgsMapTool(Mapcanvas)
{
   pLayer=NULL;
   mCursor=Qt::ArrowCursor;
   mCanvas=Mapcanvas;
   StatusFlag=true;
   isShowFlag = true;
   mIdentifyResultDlg = NULL;
}

QgsMapToolSelect::~QgsMapToolSelect(void)
{
}
//設定當前被選擇(活動)的圖層
void QgsMapToolSelect::SetSelectLayer(QgsVectorLayer *Layer)
{
   pLayer=Layer;
}

//滑鼠按鈕釋放時,選擇包含滑鼠位置的圖元
void QgsMapToolSelect::canvasReleaseEvent(QMouseEvent * e )
{
   if(mCanvas==NULL){
	   return;
   }
   if(pLayer==NULL){
	   QMessageBox::about(mCanvas,QString::fromLocal8Bit("警告"),QString::fromLocal8Bit("請選擇圖層"));
	   return;
   }
   if(StatusFlag==false){
	   return;
   }
   //得到產生事件的按鈕資訊
   Qt::MouseButton mButton=e->button();
   //如果不是左按鈕返回
   if(mButton!=Qt::MouseButton::LeftButton){
	   return;
   }
   //得到滑鼠指標的位置
   QPoint pos=e->pos();
   //定義QgsRubberBand物件
   QgsRubberBand rubberBand(mCanvas,true);
   QRect selectRect(0,0,0,0);
   //設定滑鼠位置區域
   ExpandSelectRangle(selectRect,pos);
   //將滑鼠位置區域轉換成地圖座標
   SetRubberBand(selectRect,&rubberBand );
   //將QgsRubberBand物件轉換為幾何物件,根據該幾何物件在圖層中選擇特徵
   QgsGeometry* selectGeom=rubberBand.asGeometry();
   if(!selectGeom){
	   return;
   }
   //確定是否按下ctrl鍵
   bool doDifference=e->modifiers()&Qt::ControlModifier ? true:false;
   //在圖層中選擇最靠近幾何物件的特徵
   SetSelectFeatures(selectGeom,false,doDifference,true);
   //SetSelectFeatures(selectGeom,doDifference);

   //設定選擇的特徵
   pLayer->setSelectedFeatures(layerSelectedFeatures);
   list = GetAttributeValue(pLayer, layerSelectedFeatures);

   if (isShowFlag)
   {
	   ResultDlg()->InitialData(list);
	   ResultDlg()->show();
   }
   else
   {
	   QMessageBox::information(NULL, tr("警告"), tr("請選擇向量圖層"), QMessageBox::Ok);
   }
   delete selectGeom;
   rubberBand.reset(true);
   
}
//提取滑鼠位置一定範圍作為選擇區域
void QgsMapToolSelect::ExpandSelectRangle(QRect &Rect,QPoint Point)
{
   int boxSize=0;
   //如果圖層不是面圖元型別
   if(pLayer->geometryType()!=QGis::Polygon){
       boxSize=5;
   }
   else{
	   boxSize=1;
   }
   //設定選擇區域
   Rect.setLeft(Point.x()-boxSize);
   Rect.setRight(Point.x()+boxSize);
   Rect.setTop(Point.y()-boxSize);
   Rect.setBottom(Point.y()+boxSize);
}
//將指定的裝置座標區域轉換成地圖座標區域
void QgsMapToolSelect::SetRubberBand(QRect &selectRect,QgsRubberBand *pRubber)
{
    //得到當前座標變換物件
	const QgsMapToPixel* transform=mCanvas->getCoordinateTransform();
    //將區域裝置座標轉換成地圖座標
	QgsPoint ll=transform->toMapCoordinates(selectRect.left(),selectRect.bottom());
    QgsPoint ur = transform->toMapCoordinates(selectRect.right(),selectRect.top());
    pRubber->reset(true );
    //將區域的4個角點新增到QgsRubberBand物件中
	pRubber->addPoint(ll,false );
    pRubber->addPoint(QgsPoint(ur.x(), ll.y()),false );
    pRubber->addPoint(ur,false );
    pRubber->addPoint(QgsPoint( ll.x(), ur.y() ),true );
}
//選擇幾何特徵
//selectGeometry:選擇特徵的選擇幾何體
//doContains:選擇的特徵是否包含在選擇幾何體內部
//singleSelect:僅僅選擇和選擇幾何體最靠近的特徵
void QgsMapToolSelect::SetSelectFeatures(QgsGeometry *selectGeometry,bool doContains,
										 bool doDifference,bool singleSelect) 
{
    //如果選擇幾何體不是多邊形
    if(selectGeometry->type()!=QGis::Polygon){
      return;
    }
    QgsGeometry selectGeomTrans(*selectGeometry);
    //設定選擇幾何體的座標系和圖層的座標系一致
	if(mCanvas->mapRenderer()->hasCrsTransformEnabled()){
       try{
           //將地圖繪板座標系變換到圖層座標系
		   QgsCoordinateTransform ct(mCanvas->mapRenderer()->destinationSrs(),pLayer->crs());
           //設定幾何體的座標系和圖層座標系一致
		   selectGeomTrans.transform(ct);
       }
       //對於異常點丟擲異常
	   catch(QgsCsException &cse){
          Q_UNUSED(cse);
          //catch exception for 'invalid' point and leave existing selection unchanged
          QMessageBox::warning(mCanvas, QObject::tr("CRS Exception"),
                            QObject::tr( "Selection extends beyond layer's coordinate system." ) );
		  return;
       }
    }
    //設定游標
	//QApplication::setOverrideCursor(Qt::WaitCursor);
    //選擇和選擇幾何體相交或在幾何體內部的特徵
	pLayer->select(QgsAttributeList(),selectGeomTrans.boundingBox(),true,true);
	int nh=pLayer->selectedFeatureCount();
    QgsFeatureIds newSelectedFeatures;
    QgsFeature f;
    int closestFeatureId=0;
    bool foundSingleFeature=false;
    double closestFeatureDist=std::numeric_limits<double>::max();
	//得到當前選擇的特徵
	while(pLayer->nextFeature(f)){
       QgsGeometry* g=f.geometry();
	   //g是否包含在selectGeomTrans幾何體內部
	   if(doContains && !selectGeomTrans.contains(g)){
           continue;
       }
       if(singleSelect){ //選擇和幾何體最靠近的特徵
          foundSingleFeature=true;
          //計算兩個幾何體之間的距離
		  double distance=g->distance(selectGeomTrans);
          if(distance<=closestFeatureDist){
              closestFeatureDist=distance;
              //計算出最靠近選擇幾何體特徵的id
			  closestFeatureId=f.id();
          }
       }
       else{ //儲存符合要求的特徵id
          newSelectedFeatures.insert(f.id());
       }
   }
   //確定和選擇幾何體最靠近特徵的id
   if(singleSelect && foundSingleFeature){
       newSelectedFeatures.insert(closestFeatureId);
   }
   //如果按下ctrl鍵,選擇多個特徵
   if(doDifference){
       //得到所有選擇特徵的id
	   layerSelectedFeatures=pLayer->selectedFeaturesIds();
       QgsFeatureIds::const_iterator i=newSelectedFeatures.constEnd();
       while(i!=newSelectedFeatures.constBegin()){
           --i;
		   if(layerSelectedFeatures.contains(*i)){
               layerSelectedFeatures.remove( *i );
           }
           else{
               layerSelectedFeatures.insert( *i );
           }
       }
  }
  else{
      layerSelectedFeatures=newSelectedFeatures;
  }

  //QApplication::restoreOverrideCursor();
}
//選擇幾何特徵,用於選擇面狀幾何特徵
//selectGeometry:選擇幾何體
void QgsMapToolSelect::SetSelectFeatures(QgsGeometry *selectGeometry,bool doDifference) 
{
    //如果選擇幾何體不是多邊形
    if(selectGeometry->type()!=QGis::Polygon){
      return;
    }
    QgsGeometry selectGeomTrans(*selectGeometry);
    //設定選擇幾何體的座標系和圖層的座標系一致
	if(mCanvas->mapRenderer()->hasCrsTransformEnabled()){
       try{
           //將地圖繪板座標系變換到圖層座標系
		   QgsCoordinateTransform ct(mCanvas->mapRenderer()->destinationSrs(),pLayer->crs());
           //設定幾何體的座標系和圖層座標系一致
		   selectGeomTrans.transform(ct);
       }
       //對於異常點丟擲異常
	   catch(QgsCsException &cse){
          Q_UNUSED(cse);
          //catch exception for 'invalid' point and leave existing selection unchanged
          QMessageBox::warning(mCanvas, QObject::tr("CRS Exception"),
                            QObject::tr( "Selection extends beyond layer's coordinate system." ) );
		  return;
       }
    }
    //設定游標
	//QApplication::setOverrideCursor(Qt::WaitCursor);
    //選擇和選擇幾何體相交或在幾何體內部的特徵
	pLayer->select(QgsAttributeList(),selectGeomTrans.boundingBox(),true,true);
	int nh=pLayer->selectedFeatureCount();
    QgsFeatureIds newSelectedFeatures;
    QgsFeature f;
    
	int  p=0;
	//得到當前選擇的特徵
	while(pLayer->nextFeature(f)){
		p++;
       QgsGeometry* g=f.geometry();
       //選擇的特徵是否包含在選擇幾何體的內部
	   //如果g包含selectGeomTrans,返回true
	   if(!g->contains(&selectGeomTrans)){
           continue;
       }
       //儲存符合條件圖層特徵id
	   newSelectedFeatures.insert(f.id());
   }
   QgsFeatureIds layerSelectedFeatures;
   //如果按下ctrl鍵,可以選擇多個特徵
   if(doDifference){
       layerSelectedFeatures=pLayer->selectedFeaturesIds();
       QgsFeatureIds::const_iterator i = newSelectedFeatures.constEnd();
       while( i != newSelectedFeatures.constBegin()){
           --i;
          if( layerSelectedFeatures.contains( *i ) )
          {
             layerSelectedFeatures.remove( *i );
          }
          else
          {
             layerSelectedFeatures.insert( *i );
          }
       }
  }
  else{
     layerSelectedFeatures=newSelectedFeatures;
  }
  //設定選擇的特徵
  pLayer->setSelectedFeatures(layerSelectedFeatures);
  //QApplication::restoreOverrideCursor();
}
//設定工具狀態
void QgsMapToolSelect::SetEnable(bool flag)
{
	StatusFlag=flag;
	if(StatusFlag){
		mCursor=Qt::CrossCursor;
	}
	else{
		mCursor=Qt::ArrowCursor;
	}
}

IdentifyResultDlg * QgsMapToolSelect::ResultDlg()
{
	if (mIdentifyResultDlg == NULL)
	{
		mIdentifyResultDlg = new IdentifyResultDlg;
	}
	return mIdentifyResultDlg;
}

//得到選擇的要素的屬性資訊
QList<QMap<QString, QString>> QgsMapToolSelect::GetAttributeValue( QgsVectorLayer *layer, QgsFeatureIds selectedFIds )
{
//	QStringList strAttribute;
	QMap<QString, QString> featureValue; 
	QList<QMap<QString, QString>> featureValues;
	int i = 0, nFeatureCount = 0, nFieldsCount = 0;
	if (layer == NULL)
	{
		return featureValues;
	}
	QgsFeatureList featurelist = layer->selectedFeatures();
	nFeatureCount = featurelist.size();
	QgsFeature feature;
	QString fieldName, fieldValue;
//	vector<QgsField> myFields = layer->fields();
	for (i = 0; i < nFeatureCount; i++)
	{
		feature = featurelist.at(i);
		const QgsAttributeMap &attributes = feature.attributeMap();
		nFieldsCount = attributes.count();
		const QgsFieldMap &fields = layer->pendingFields();//從圖層得到欄位資訊
		QgsField field;
		for(int j = 0; j < nFieldsCount; j++)
		{
			field = fields[j];
			fieldName = field.name();

			fieldValue = attributes[j].toString();
			featureValue.insert(fieldName, fieldValue);
		}
		featureValues.push_back(featureValue);
	}
	return featureValues;
}

void QgsMapToolSelect::setShowFlag( bool flag )
{
	isShowFlag = flag;
}

查詢得到的資料顯示在對話方塊: IdentifyResultDlg對話方塊是為了顯示查詢得到的結果。它的定義:
class IdentifyResultDlg : public QDialog
{
	Q_OBJECT

public:
	IdentifyResultDlg(QWidget *parent = 0);
	~IdentifyResultDlg();
	void InitialDlg();
	void InitialData(QList<QMap<QString, QString>>);
private:
	Ui::IdentifyResultDlg ui;
	QStandardItemModel *fieldmodel;

};
IdentifyResultDlg具體實現:
#include "identifyresultdlg.h"
IdentifyResultDlg::IdentifyResultDlg(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	QStringList lists;
	InitialDlg();
}
IdentifyResultDlg::~IdentifyResultDlg()
{
}
void IdentifyResultDlg::InitialDlg()
{
	this->setWindowTitle(tr("查詢要素屬性資訊"));
	fieldmodel = new QStandardItemModel();
	fieldmodel->setColumnCount(2);

	ui.tableView->setModel(fieldmodel); 
	ui.tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//設定表格不可編輯
	ui.tableView->verticalHeader()->hide(); //列頭不顯示
	ui.tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//選擇整行高亮
	setWindowFlags(Qt::WindowStaysOnTopHint);//使視窗置頂
	this->resize( 240, 300);
}
//將資料顯示在表格中
void IdentifyResultDlg::InitialData( QList<QMap<QString, QString>> datas)
{
	fieldmodel->clear();//注意:在clear之後,表頭名稱也被清除了,需再設定表頭
	fieldmodel->setHorizontalHeaderItem(0, new QStandardItem(QObject::tr("屬性名稱")));
	fieldmodel->setHorizontalHeaderItem(1, new QStandardItem(QObject::tr("屬性值")));

	QString name, value;
	QMap<QString,QString>::iterator it;
	int i = 0;
	for (i = 0; i < datas.count(); i ++)
	{
		QMap<QString,QString> data = datas.at(i);
		int j = 0;
		for (it = data.begin(),  j = 0; it != data.end(), j < data.count(); ++it, ++j)
		{
			int index = i * data.count() +j;
			fieldmodel->setItem(index, 0, new QStandardItem(it.key()));
			if (it.value() == NULL)
			{
				it.value() = "0";
			}
			fieldmodel->setItem(index, 1, new QStandardItem(it.value()));
			fieldmodel->item(index, 0)->setTextAlignment(Qt::AlignCenter);
			fieldmodel->item(index, 1)->setTextAlignment(Qt::AlignCenter);
			if ( j%(data.count()) == 0)
			{
				fieldmodel->item(index, 0)->setBackground(QBrush(QColor(188, 188, 188)));
				fieldmodel->item(index, 1)->setBackground(QBrush(QColor(188, 188, 188)));
			}
		}		
	}	
}

查詢一個要素和多個要素的結果如下圖所示:


注意:可能中文欄位顯示亂碼,解決方法:

在操作shp之前,新增這句就可以了:  

CPLSetConfigOption("SHAPE_ENCODING","");


相關推薦

QGis查詢向量要素屬性

當載入一個向量圖層後,如果要檢視要素的屬性欄位值,則需要實現identity的功能。可以和前面的縮放一樣,新增一個工具欄按鈕: (1)在MainWindow新增一個變數,並在Qt設計師裡新增Action: QgsMapToolSelect *mpIdentifyTool

QGisshp向量新增新

新增一個新的欄位到shp檔案中,並且從Excel裡匯入資料到該欄位。原shp檔案裡的欄位ID應該與Excel裡的欄位ID一一對應才能正確的匯入。下圖分別是shp的欄位和Excel的欄位 將class欄位新增到shp中去: (1)從Excel中讀取資料(為了讀取方便,存為.

keepalived簡單實驗vrrp_script中要不要寫weight

今天在公司看到keepalived主備機器上的keepalived配置檔案的vrrp_scrip段中都沒有weight欄位,直接貼圖吧: master的配置檔案: backup的配置檔案: 指令碼的內容: 我在想,這樣寫就算master那邊的vrrp_scrip

Mysql查詢優化從入門到跑路查詢的基本操作

限制 sql 數據 單位 二維 一行 用戶 div 答案 查詢的基本操作 1.選擇操作 對應的是限制條件,操作對象是二維表的行。 優化方式:選擇操作下推 目的:盡量減少連接操作前的元租數,使得中間臨時關系盡量少(元祖數少,連接得到的元組數就少) 好處

mongo源碼學習請求接收傳輸

stand can ssa 傳輸層 網絡 fault ets reference reat 在上一篇博客中(mongo源碼學習(二)db.cpp之mongoDbMain方法分析),我們把db.cpp中的mongoDbMain的執行過程分析了一下,最後會調用initAndLi

tarjan演算法入門——有向的強連通分量

一.概述. 強連通分量SCC是基於有向圖的一個概念,即“極大連通分量”.有向圖的強連通分量就是說一張圖G的子圖G',G'的每一個點u都可以遍歷到這張圖上的任意一個點v,且這張子圖G'極大,極大的意思可以參考雙連通分量的極大.   二.強連通分量與tarjan演算法. t

機器學習——支援向量機SVM

SVM探討 目錄 SVM探討 SVM演算法 根據處理問題的複雜度,SVM 可由簡到繁分為三種: 線性可分支援向量機:硬間隔最大化。 線性支援向量機:資料分佈近似線性可分,可通過軟間隔最大化(懲罰因子,鬆弛變數)來線性分隔樣本點。 非線性支援向量機:通過核函式提升

vue 2.0 實戰 移動音樂app輪播元件的實現

1.slider子元件 和 recommend父元件結構。利用了slot 卡槽。簡單點來說,就是子元件預先在相應的位置留了一個坑,父元件引用了子元件以後,把對應的坑填上。 <template> <div class="slider" ref="slid

JFreeChart之條形

轉載自  JFreeChart條形圖 本章演示瞭如何使用JFreeChart從一個給定的業務資料建立條形圖。 條形圖使用不同的方位(水平或垂直)條,以顯示不同類別的比較。圖表中的一個軸(域軸)示出了特定的域進行比較,並在另一個軸(範圍軸)表示的離散值。 業務資料

OpenGL 載入貼

有了模型還需要貼圖。 載入貼圖 的流程大體分為兩部分,首先是圖片的解碼,其次是使用UV座標與模型對應。本文主要從底層原理和第三方庫兩個方面來介紹 載入貼圖 。解碼下面分別介紹硬編碼實現和SOIL庫兩種方式。硬編碼實現因為載入不同的型別圖片偏移值不一樣,載入圖片之前要確定圖片型

Lucene7.2.1系列查詢及高亮

系列文章: 一 準備 建立專案並新增Maven依賴 <dependency> <groupId>junit</groupId> <

玩轉Web之servlet---一張看懂B/S架構

學WEB, 首先 要明白B/S架構,本文將簡單說一下小編的愚見,若有不當,歡迎大家指正。 首先,什麼是B/S架構?B/S是Broweser/Server的縮寫,即瀏覽器/伺服器模式,簡單說就是客戶端使用瀏覽器,服務端使用Web伺服器,客戶端與服務端之間使用http協議進行通

caffe學習:caffe視覺引數

原文見http://www.cnblogs.com/denny402/p/5071126.html    用於備忘 本文只講解視覺層(Vision Layers)的引數,視覺層包括Convolution, Pooling, Local Response Normaliz

--各種基礎演算法總結

圖論總結 G=(V,E),V代表圖中節點的合集,E代表圖中邊或是關係的合集。 稠密圖:圖中E的條數接近V*V也就是,接近任意兩點之間相連。 稀疏圖:圖中E的條數遠小於V*V。 圖的資料結構 圖常用的有兩種表示方式,鄰接連結串列和鄰接矩陣。 鄰接矩陣和鄰接連結串列都中儲存的資訊都只是點

UML學習:序列順序/物件順序

UML的模型中可分為兩種,動態模型和靜態模型。用例圖、類圖和物件圖都是UML中的靜態結構模型。而在UML系統動態模型的其中一種就是互動檢視,它描述了執行系統功能的各個角色之間相互傳遞訊息的順序關係。序列圖就是互動檢視的一種形式。 1、序列圖的定義   序列圖是對物件之間傳送

筆記Photoshop中混合模式理解

轉載自: Photoshop的混合模式作為一個比較的中英文名稱和用處一直對不 上號,每次都是Shift + +/- 一個個試,整理一下。 (PS的教程那麼多醜的也那麼多,感覺要好好整理才能學到提升審美的東西。) 1. 介面 (發現順序竟然是一一對應的。。。) (

openlayers3 在地圖上疊加WFS查詢向量

隨著終端裝置計算能力的加強,使用者在使用地圖的時候也需要越來越多的互動效果。比如現在很火的室內導航,為了獲得好的使用者體驗,就需要當用戶單擊某一商店的時候該商店的顏色能相應的變化,這就需要疊加向量圖層。如何能在瓦片地圖之上疊加向量圖層呢,這個就需要用到WFS查詢

Java Robot 編寫指令碼機器人螢幕截

public class Main{/*** @param args* @throws IOException*/public static void main(String[] args) throws IOException {try {Dimension dimensi

自定義控制元件三部曲之繪圖篇十三——Canvas與(一)

前言:猛然知道姥姥79了,我好怕,好想哭系列文章:一、如何獲得一個Canvas物件方法一:自定義view時, 重寫onDraw、dispatchDraw方法(1)、定義 我們先來看一下onDraw、dispatchDraw方法的定義protected void onDraw(

Android驅動硬體訪問服務學習之Android加入HAL訪問硬體

硬體平臺:tiny4412系統:Android  5.0.2編譯器: arm-linux-gcc-4.5.1 當時我們把對硬體的操作放在了JNI層,但是Android並不是這樣,google提出HAL層,即硬體封裝層 這一節我們把硬體的操作封裝裝HAL層。 andr