編輯:關於Android編程
第一篇博客裡面有介紹一篇關於自動換行實現諸多自定義控件跟各種效果的博文,但是礙於當初技術能力有限,寫的jar包裡的代碼亂七八糟,在最近忙完了手頭的工作,不經意間翻看了之前的代碼,真是慘不忍睹,隨決定重新封裝。重新編寫的android-custom-vg前後修改了多次版本暫定為2.6.0,模擬的ListView加載數據的流程,為了更方便的使用。只做了最基礎的效果,ListView中定位某個View顯示的屬性,則沒有被實現。
自定義控件換行效果jar調用API:
setDividerWidth(int dividerWidth); //設置兩個Item的水平間距,第一個Item距離左邊框距離為0
setDividerHeight(int dividerHeight); //設置兩個Item的垂直間距,第一行Item距離頂部邊框距離為0
setOnItemClickListener(OnItemClickListener listener); //獲取Item的點擊事件
setOnItemLongClickListener(OnItemLongClickListener listener); //獲取Item的長按事件
效果圖:
1、activity_main.xml:為了實現滑動效果,把自定義控件放進ScrollView控件中
import com.custom.vg.list.CustomListView; import com.custom.vg.list.OnItemClickListener; import com.custom.vg.list.OnItemLongClickListener; public class MainActivity extends Activity implements OnClickListener { private String TAG = MainActivity.class.getSimpleName(); private CustomListView lv; private Listlist = null; private MainSexangleAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (CustomListView) findViewById(R.id.sexangleView); findViewById(R.id.btn_add).setOnClickListener(this); findViewById(R.id.btn_remove).setOnClickListener(this); new Thread(new MyFormatListThread()).start(); } private void ShowSexangleListView(){ adapter = new MainSexangleAdapter(this, list); lv.setDividerHeight(10); lv.setDividerWidth(10); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { Toast.makeText(MainActivity.this, 點擊了 : +arg2, 300).show(); } }); lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView arg0, View arg1, int arg2,long arg3) { Toast.makeText(MainActivity.this, Long點擊了 : +arg2, 300).show(); return true; } }); } private Handler handler = new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message msg) { try{ if(msg.getData().containsKey(showSexangleListView)){ ShowSexangleListView(); } }catch(Exception e){} } }; public class MyFormatListThread implements Runnable{ @Override public void run() { Bundle b = new Bundle(); try{ list = new ArrayList (); list.add(宇宙); list.add(宙即我心); list.add(心我心即宇); list.add(宇宙即我心我心即); list.add(心即宇宙細); list.add(即); list.add(宇宙細微); list.add(祥淵源); list.add(之發祥淵源實為); list.add(文明之); list.add(發祥); list.add(源實為諸人種); list.add(宇宙); list.add(宙即我心); list.add(心我心即宇); list.add(宇宙即我心我心即); list.add(心即宇宙細); list.add(即); list.add(宇宙細微); list.add(祥淵源); list.add(之發祥淵源實為); list.add(文明之); list.add(發祥); list.add(源實為諸人種); b.putBoolean(showSexangleListView, true); }catch(Exception e){ Log.w(TAG, e); }finally{ sendMsgHandler(handler,b); } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_add: list.add(Button添加+list.size()); adapter.notifyDataSetChanged(); break; case R.id.btn_remove: list.remove(0); adapter.notifyDataSetChanged(); break; } } private void sendMsgHandler(Handler handler,Bundle bundle){ Message msg = handler.obtainMessage(); msg.setData(bundle); handler.sendMessage(msg); } private class GetDataTask extends AsyncTask { @Override protected String[] doInBackground(Void... params) { // Simulates a background job. try { Thread.sleep(1000); if(list == null) list = new ArrayList (); else list.clear(); list.add(宇宙); list.add(宙即我心); list.add(心我心即宇); list.add(宇宙即我心我心即); list.add(心即宇宙細); list.add(即); list.add(宇宙細微); list.add(祥淵源); list.add(之發祥淵源實為); list.add(文明之); list.add(發祥); list.add(源實為諸人種); list.add(宇宙); list.add(宙即我心); list.add(心我心即宇); list.add(宇宙即我心我心即); list.add(心即宇宙細); list.add(即); list.add(宇宙細微); list.add(祥淵源); list.add(之發祥淵源實為); list.add(文明之); list.add(發祥); list.add(源實為諸人種); } catch (InterruptedException e) { } return null; } @Override protected void onPostExecute(String[] result) { // Do some stuff here // Call onRefreshComplete when the list has been refreshed. ShowSexangleListView(); super.onPostExecute(result); } } }
import com.custom.vg.list.CustomAdapter; public class MainSexangleAdapter extends CustomAdapter { private Listlist; private Context con; private LayoutInflater inflater; public MainSexangleAdapter(Context context, List list) { this.con = context; this.list = list; inflater = LayoutInflater.from(con); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder vh = null; if(convertView == null){ vh = new ViewHolder(); convertView = inflater.inflate(R.layout.adapter_sexangle_item_style, null); vh.tv = (TextView) convertView.findViewById(R.id.adapter_text); convertView.setTag(vh); }else{ vh = (ViewHolder) convertView.getTag(); } String str = list.get(position); vh.tv.setText(str); return convertView; } public class ViewHolder{ public TextView tv; } }
1、Service的種類按運行地點分類: 類別 區別 優點 缺點 應用
-當窗口工具通過Analyse | Inspect Code方式打開以後,你可以通過這種方式訪問此窗口工具。-當點擊關閉按鈕關閉工具窗口以後,只能通過Analyze |
很多項目需要用到彈幕效果,尤其是在播放視頻的時候需要一起顯示別人發的彈幕,也包括自己的發的。今天就試著寫了一下這個效果。 思路就是將從右往左的動畫效果,字體內容
1. 前言:在平時的開發中,我們在顯示圖片是有時候需要顯示圓角圖片,我們應該都知道圓角顯示肯定是更加耗費內存和性能,會導致圖片的過度繪制等問題。但是有時候產品的設計就是這