ListView座標轉Postion
(ListView) view).pointToPosition((int) x, (int) y)
ListView getChildAt 他的API說傳Postion就可以
But沒那麼簡單
他的Postion指的事這個頁面上可視元件的位置
所以必須
listView.getChildAt(position - listView.getFirstVisiblePosition())
開這網站的目的是發現有很多人想了解電腦相關資訊,補習費用也不便宜,下了班很累想休息一下時間無法配合於是想分享我所學 未來會包含課程規劃會有: 程式語言上:Java、C#、PHP.. 手機設計:Android,、ObjectC 認證包含:SCJP、SCWCD、LPI1~LPI2.... 網頁設計:HTML5、JavaScript.... 陸陸續續會再增加! 以上課程都是我本人教學如有任何問題可在此留言我會答覆您的
HTML/JavaScript小工具
HTML/JavaScript小工具
2014年8月1日 星期五
2014年7月2日 星期三
是否能使用GPS或網路提共LocationMange
locationMange.isProviderEnabled(LocationManager.GPS_PROVIDER);
locationMange.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
locationMange.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
2014年6月29日 星期日
自定Cursor使用於LoaderManager
public class HelloWorld {
public class MainActivity extends Activity implements LoaderCallbacks{
ListFragment listFragment = null;
SimpleCursorAdapter simpleCursorAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listFragment = new ListFragment(){
//實現ListFargmnt 點選時反應
@Override
public void onListItemClick(ListView l, View v, int position,
long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Log.d("Howard", "onItemSelected position:"+position);
}
};
simpleCursorAdapter =
new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,
new String[]{"AA"},
new int[]{android.R.id.text1}, 0);
listFragment.setListAdapter(simpleCursorAdapter);
getFragmentManager().beginTransaction().
add(R.id.container,
listFragment, "test").commit();
getLoaderManager().initLoader(0, null, this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
//自訂一個MYCursor 需extends AbstractCursor
private class MYCursor extends AbstractCursor{
List names = new ArrayList();
public MYCursor(){
for(int i =0 ;i < 100;i++){
names.add("howard:"+i);
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return names.size();
}
@Override
public String[] getColumnNames() {
// TODO Auto-generated method stub
//_id 實作在getLong(int column)
//_id必須要的欄位不然會出錯
return new String[]{"_id","AA"};
}
@Override
public String getString(int column) {
// TODO Auto-generated method stub
return names.get(this.getPosition());
}
@Override
public short getShort(int column) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getInt(int column) {
// TODO Auto-generated method stub
Log.d("Howard", "getInt:"+column);
return 0;
}
@Override
public long getLong(int column) {
// TODO Auto-generated method stub
return 0;
}
@Override
public float getFloat(int column) {
// TODO Auto-generated method stub
return 0;
}
@Override
public double getDouble(int column) {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isNull(int column) {
// TODO Auto-generated method stub
return false;
}
}
//非UI執行緒
@Override
public Loader onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
//建立一個CursorLoader 並複寫loadInBackground 回傳一個自訂的Cursor
CursorLoader cusorLoader =
new CursorLoader(this){
@Override
public Cursor loadInBackground() {
// TODO Auto-generated method stub
Log.d("Howard", "Thread Name loadInBackground:"+
Thread.currentThread().getName());
return new MYCursor();
}
};
return cusorLoader;
}
// 在Android UI執行緒
@Override
public void onLoadFinished(Loader loader, Cursor data) {
// TODO Auto-generated method stub
Log.d("Howard", "Thread onLoadFinished:"+
Thread.currentThread().getName());
simpleCursorAdapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader loader) {
// TODO Auto-generated method stub
simpleCursorAdapter.swapCursor(null);
}
}
2014年5月15日 星期四
sprite Create使用注意點
sprite
sprite Create 使用時要注意
1 pivot 中心點(0.5,0.5) 左下角為(0,0)
2 分割方塊時要注意如:
圖片高寬768 * 1024
高為1024
要取得最左邊點時
Rect (0,1024,180,180)
以上會出錯
記得要將1024 - 180
因為他是下往上取區間!~也就是說他會用1024 + 180就會超過高度
當宣告時要Rect (0,1024 - 180,180,180)
3 Sprite 不能單獨存在必須搭配
SpriteRenderer.sprite
轉載一段程式碼跟Sprite中心點有關的
- using UnityEngine;
- using System.Collections;
- public class SpritePivotAlignment {
- public SpriteAlignment GetSpriteAlignment(GameObject SpriteObject){
- BoxCollider2D MyBoxCollider= SpriteObject.AddComponent<BoxCollider2D> ();
- float colX = MyBoxCollider.center.x;
- float colY = MyBoxCollider.center.y;
- if (colX > 0f && colY < 0f)
- return (SpriteAlignment.TopLeft);
- else if (colX < 0 && colY < 0)
- return (SpriteAlignment.TopRight);
- else if (colX == 0 && colY < 0)
- return (SpriteAlignment.TopCenter);
- else if (colX > 0 && colY == 0)
- return (SpriteAlignment.LeftCenter);
- else if (colX < 0 && colY == 0)
- return (SpriteAlignment.RightCenter);
- else if (colX > 0 && colY > 0)
- return (SpriteAlignment.BottomLeft);
- else if (colX < 0 && colY > 0)
- return (SpriteAlignment.BottomRight);
- else if (colX == 0 && colY > 0)
- return (SpriteAlignment.BottomCenter);
- else if (colX == 0 && colY == 0)
- return (SpriteAlignment.Center);
- else
- return (SpriteAlignment.Custom);
- }
- }
2014年4月16日 星期三
Unity3d當中的旋轉!
1 如果要不停的旋轉可使用
transform.Rotate(Vector3.right, 90 * Time.deltaTime);
指定要旋轉的軸 與角度
2 如果要指定旋轉到某個角度又需要滑順感可用
parent.rotation = Quaternion.Slerp(parent.rotation, Quaternion.Euler(roleRotation), Time.deltaTime);
3 Quaternion.Angle 可取得2物件之間的夾角
4 如果要使用 Quaternion.LookRotation
a LookRotation 記得傳是參數值是方向
b 如果想指定旋轉的軸向,記得要將Quaternion 轉成 Vector3使用 eulerAngles
將不要轉的軸改為0如下
drication = monster.transform.position - parent.position;
roleRotation = Quaternion.LookRotation(drication).eulerAngles;
roleRotation.x = 0;
roleRotation.z = 0;
2014年3月27日 星期四
java Mask方式
要清空特定一位,则将该整数与特定所对应的掩码的按位补码(特定位为 0,其他位为 1)
进行按位与(bitwise-AND)操作。Java 中的按位与操作符是&,而按位补码操作符是~:
BIT7 本來是 1000 0000 0x80
~BIT7 反向後 11111111111111111111111101111111
作&之後可以可以去除0位置的內容
bitmap &= ~BIT7
,一次设置和清空多位:
bitmap &= ~(BITS2AND3|BIT5);
~(BITS2AND3|BIT5) 所有要關閉的位置
bitmap 要被關閉的數值
要测试一个整数的特定位是否已经被设置,可以将该整数与特定位对应的掩码进行按位与,
并将操作结果与 0 比较:
boolean bit6Set = (bitmap & (1<<6)) != 0;
进行按位与(bitwise-AND)操作。Java 中的按位与操作符是&,而按位补码操作符是~:
BIT7 本來是 1000 0000 0x80
~BIT7 反向後 11111111111111111111111101111111
作&之後可以可以去除0位置的內容
bitmap &= ~BIT7
,一次设置和清空多位:
bitmap &= ~(BITS2AND3|BIT5);
~(BITS2AND3|BIT5) 所有要關閉的位置
bitmap 要被關閉的數值
要测试一个整数的特定位是否已经被设置,可以将该整数与特定位对应的掩码进行按位与,
并将操作结果与 0 比较:
boolean bit6Set = (bitmap & (1<<6)) != 0;
socket-2 基本型(int,long,short)分割成byte
因為要將基本型態轉成byte以下是自己手動轉型的方法
因為TCP 傳送是Byte形式所以~基本型態都必須分解成byte
假設我想要把int分解成byte模式作法如下
1 先算出1個整數有多少個Byte等等需要建立一個byte陣列儲存
int size = Integer.SIZE / Byte.SIZE;
int test1 = 512;
byte[] byteArray = new byte[size];
2選告一個遮罩(mask)0xff是16位元~顯示方法算成2進位
1111 1111 剛好八位元
int mask = 0xff;
3 一個迴圈將所有的整數取出,放置於一個byte陣列
for (int i = 0; i < size;i++){
byteArray[i] = (byte)(test1 >> (size - i - 1) * Byte.SIZE);
}
解釋一下:
因為要將int分解存到byte ,int 是32bit byte是 8bit所以需要4長度的陣列存
每次取8個bit進到陣列裡
下面解釋一下算法~~
512整數轉成2進位如下
1 2 3 4
00000000 00000000 00000010 00000000
我們取數字先由前面開始取所以需要將1往前移 8 * 3位置
00000000 00000000 00000010 00000000
以上來說1 位移24格後 再轉換成byte(只取8位數) 是0
以上來說2 位移16格後 再轉換成byte(只取8位數) 是0
以上來說3 位移8格後 再轉換成byte(只取8位數) 是2
以上來說4 位移0格後 再轉換成byte(只取8位數) 是0
會將這些數字存到陣列內
下面是還原
1 先宣告一個長整數(因為長整數是java整數基本型態中最大的數嘍)
long show = 0;
2 將所有儲存於byte陣列的內容取出來
for (int i = 0; i < size;i++){
show = ((show << Byte.SIZE) | (byteArray[i] & mask));
}
System.out.println(show);
解釋一下做法
一樣假設512
因為一開始都是零 所以 先將後面的bit往前推8個位置 不會變化
一開始取出來的是00000000 合併這時是
00000000
後面的bit往前推8
第二筆取出來的是00000000 合併這時是
00000000 00000000
後面的bit往前推8
第三筆取出來的是00000010 合併這時是
00000000 00000000 00000010
後面的bit往前推8
第四筆取出來的是00000000 合併這時是
00000000 00000000 00000010 00000000
每次取出來一筆就把內show的最後面8位數向前移動,並且將8bit數字整合起來
以上解釋~
有更簡單的解法
使用以下物件
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeByte(byteVal);
dos.writeShort(shortVal);
dos.writeInt(intVal);
dos.writeLong(longVal);
dos.flush();
System.out.println("Decoded message: "
+ dis.readByte() + " " + dis.readShort() + " " + dis.readInt() + " " + dis.readLong());
一樣可以將基本資料形態變成byte~~
2014年3月20日 星期四
程式當中餘數之一
int a1 = 245 % 100;
int a2 = 789 % 100;
程式當中的取餘數可用於取得尾數如上
a1 = 45
a2 = 89
另外
int a1 = 245;
int s1 = 512;
想取得這a1+s1個數的尾數可使用
(a1 + s1) % 100
或是分別
先將 a1 = a1 % 100
再將他們加總(s1 + a1) % 100
答案會是一樣的
如果想取前面的位數可使用除法如
596 想取得5 可以使用 596 / 100 可取得 5
596 / 10 可取得59
int a2 = 789 % 100;
程式當中的取餘數可用於取得尾數如上
a1 = 45
a2 = 89
另外
int a1 = 245;
int s1 = 512;
想取得這a1+s1個數的尾數可使用
(a1 + s1) % 100
或是分別
先將 a1 = a1 % 100
再將他們加總(s1 + a1) % 100
答案會是一樣的
如果想取前面的位數可使用除法如
596 想取得5 可以使用 596 / 100 可取得 5
596 / 10 可取得59
2014年2月13日 星期四
Unity3d 呼叫 Android顯示Button
1 建立一個MainActivity extends UnityPlayerActivity
UnityPlayerActivity 來自於 Unity3D的目錄下
2修改程式的onCreate 將setContentView移除,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
3
建立一個靜態方法
public static void setupAdsStatic() {
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
LinearLayout layout =
new LinearLayout(UnityPlayer.currentActivity.getApplicationContext());
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.BOTTOM);
Button btn = new Button(UnityPlayer.currentActivity.getApplicationContext());
btn.setText("Howard....");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(UnityPlayer.currentActivity.getApplicationContext(),
"GOGO!!", Toast.LENGTH_SHORT).show();
}
});
layout.addView(btn);
//Drawable.createFromXmlInner(//r, parser, attrs)
UnityPlayer.currentActivity.addContentView(layout,
new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
});
}
3 AndroidManifest.xml 寫入 的activity加入
<meta-data
android:name="unityplayer.ForwardNativeEventsToDalvik"
android:value="true" />
以上是在Android的部分~~詳細請參考附件的專案吧!!
再來是unity3d了~~!
1 在Unity3d建立一個目錄並將相關資料放入!!
Plugins -->Android-->bin 這資料夾放置剛做好的Android程式轉出來的Jar
-->res 下面方一些相關的資源
drawable-hdpi
layout
values
2 我是用C#於是建立一個C#程式
void Start()
{
if (Application.platform == RuntimePlatform.Android)
{
AndroidJavaClass adMobJavaClass = new
AndroidJavaClass("com.example.testandroidunity.MainActivity");
adMobJavaClass.CallStatic("setupAdsStatic");
}
}
收工~~~~
補上一些檔案~~下次來研究如何將Google Service Admob 放進去
檔案聯結
UnityPlayerActivity 來自於 Unity3D的目錄下
2修改程式的onCreate 將setContentView移除,
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
3
建立一個靜態方法
public static void setupAdsStatic() {
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
LinearLayout layout =
new LinearLayout(UnityPlayer.currentActivity.getApplicationContext());
layout.setOrientation(LinearLayout.VERTICAL);
layout.setGravity(Gravity.BOTTOM);
Button btn = new Button(UnityPlayer.currentActivity.getApplicationContext());
btn.setText("Howard....");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(UnityPlayer.currentActivity.getApplicationContext(),
"GOGO!!", Toast.LENGTH_SHORT).show();
}
});
layout.addView(btn);
//Drawable.createFromXmlInner(//r, parser, attrs)
UnityPlayer.currentActivity.addContentView(layout,
new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
}
});
}
3 AndroidManifest.xml 寫入 的activity加入
<meta-data
android:name="unityplayer.ForwardNativeEventsToDalvik"
android:value="true" />
以上是在Android的部分~~詳細請參考附件的專案吧!!
再來是unity3d了~~!
1 在Unity3d建立一個目錄並將相關資料放入!!
Plugins -->Android-->bin 這資料夾放置剛做好的Android程式轉出來的Jar
-->res 下面方一些相關的資源
drawable-hdpi
layout
values
2 我是用C#於是建立一個C#程式
void Start()
{
if (Application.platform == RuntimePlatform.Android)
{
AndroidJavaClass adMobJavaClass = new
AndroidJavaClass("com.example.testandroidunity.MainActivity");
adMobJavaClass.CallStatic("setupAdsStatic");
}
}
收工~~~~
補上一些檔案~~下次來研究如何將Google Service Admob 放進去
檔案聯結
2014年2月9日 星期日
unity3d 返回鍵或home鍵退出
//当用户按下手机的返回键或home键退出游戏 if (Input.GetKeyDown(KeyCode.Escape) || Input.GetKeyDown(KeyCode.Home) ) { Application.Quit(); }
2014年1月22日 星期三
NGUI Prefab
將NGUI 元件 製作成 Prefab 後加入畫面中後定要一定要設定
transform.localPosition 給與一個位置
另外可以使用
NGUITools.AddChild 將NGUI Prefab 加入畫面
2014年1月19日 星期日
Unity3d Color 漸變!!
1
float alpha = spriteRenderer.color.a;
alpha -=Time.deltaTime;
Color clear = new Color(0, 0, 0, alpha);
spriteRenderer.color = clear;
2 renderer.material.color = Color.Lerp(Color.white, Color.red, Time.time);
float alpha = spriteRenderer.color.a;
alpha -=Time.deltaTime;
Color clear = new Color(0, 0, 0, alpha);
spriteRenderer.color = clear;
2 renderer.material.color = Color.Lerp(Color.white, Color.red, Time.time);
2014年1月16日 星期四
Unity3d new 2d Camera size 設定
假設背景大小是
720 * 1280
我們拿1280來說
size = 1280 / 100 /2
100 這個單位要看Sprite Pixels To Units 決定
高度是:size * 2
寬度是看比例
720 * 1280
我們拿1280來說
size = 1280 / 100 /2
100 這個單位要看Sprite Pixels To Units 決定
高度是:size * 2
寬度是看比例
2014年1月9日 星期四
Unity3d 2d 動態轉換Sprite
void Update()
{
if(Input.GetMouseButtonDown(0)){
SpriteRenderer myReanere = this.GetComponent<SpriteRenderer>();
myReanere.sprite = spr;
}
}
{
if(Input.GetMouseButtonDown(0)){
SpriteRenderer myReanere = this.GetComponent<SpriteRenderer>();
myReanere.sprite = spr;
}
}
2014年1月8日 星期三
unity3d mouse 點選
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 wp = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Collider2D h = Physics2D.OverlapPoint(wp, 1 << LayerMask.NameToLayer("role"));
if (h)
{
print("你要做的事:");
}
}
}
{
if (Input.GetMouseButtonDown(0))
{
Vector3 wp = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Collider2D h = Physics2D.OverlapPoint(wp, 1 << LayerMask.NameToLayer("role"));
if (h)
{
print("你要做的事:");
}
}
}
訂閱:
文章 (Atom)