HTML/JavaScript小工具

HTML/JavaScript小工具

2014年8月1日 星期五

ListView座標轉Postion 與 getChildAt 為 null

ListView座標轉Postion
(ListView) view).pointToPosition((int) x, (int) y)

ListView  getChildAt 他的API說傳Postion就可以
But沒那麼簡單
他的Postion指的事這個頁面上可視元件的位置
所以必須
listView.getChildAt(position - listView.getFirstVisiblePosition())

2014年7月2日 星期三

是否能使用GPS或網路提共LocationMange

locationMange.isProviderEnabled(LocationManager.GPS_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 使用時要注意
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 不能單獨存在必須搭配

轉載一段程式碼跟Sprite中心點有關的
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class SpritePivotAlignment {
  5. public SpriteAlignment GetSpriteAlignment(GameObject SpriteObject){
  6. BoxCollider2D MyBoxCollider= SpriteObject.AddComponent<BoxCollider2D> ();
  7. float colX = MyBoxCollider.center.x;
  8. float colY = MyBoxCollider.center.y;
  9. if (colX > 0f && colY < 0f)
  10. return (SpriteAlignment.TopLeft);
  11. else if (colX < 0 && colY < 0)
  12. return (SpriteAlignment.TopRight);
  13. else if (colX == 0 && colY < 0)
  14. return (SpriteAlignment.TopCenter);
  15. else if (colX > 0 && colY == 0)
  16. return (SpriteAlignment.LeftCenter);
  17. else if (colX < 0 && colY == 0)
  18. return (SpriteAlignment.RightCenter);
  19. else if (colX > 0 && colY > 0)
  20. return (SpriteAlignment.BottomLeft);
  21. else if (colX < 0 && colY > 0)
  22. return (SpriteAlignment.BottomRight);
  23. else if (colX == 0 && colY > 0)
  24. return (SpriteAlignment.BottomCenter);
  25. else if (colX == 0 && colY == 0)
  26. return (SpriteAlignment.Center);
  27. else
  28. return (SpriteAlignment.Custom);
  29. }
  30. }


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;




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

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 放進去
檔案聯結

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);

2014年1月16日 星期四

Unity3d new 2d Camera size 設定

假設背景大小是
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;
       }
    }

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("你要做的事:");
            }
         
        }
    }