編輯:關於Android編程
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#000000"> </solid> <corners android:radius="5dip"/> </shape>
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#00ffff"/> <corners android:radius="5dip"/> </shape>
上面通過配置xml文件來完成View的顯示方式,因為這五個點的形狀,大小,甚至是顯示方式基本都是相同的,如果再去找5個點圖片或者是一個點圖片,然後通過Drawable資源的調用完成圖片的顯示...通過加載5次的方式...這樣顯然是沒有必要的,會浪費不必要的資源..因此我們可以使用xml提供的自定義圖形來完成這個過程...xml為我們提供了shape屬性,自定義控件..這裡我定義了一個實心圓...這個實心圓來完成隨著圖像的滑動,這個點也隨之進行相應的變化...看起來並不是什麼難理解的東西...
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <FrameLayout android:layout_height="300dip" android:layout_width="fill_parent"> <android.support.v4.view.ViewPager android:id="@+id/vp" android:layout_height="fill_parent" android:layout_width="fill_parent"/> <LinearLayout android:layout_height="30dip" android:layout_width="fill_parent" android:gravity="center" android:layout_gravity="bottom" android:orientation="vertical" android:background="#20000000" > <TextView android:id="@+id/tv" android:layout_height="wrap_content" android:layout_width="wrap_content" android:textColor="@android:color/white" android:text="@string/hello_world" android:layout_gravity="center_horizontal" android:layout_marginTop="3dip"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="3dip"> <View android:id="@+id/dot_0" android:layout_width="5dip" android:layout_height="5dip" android:layout_marginRight="3dip" android:layout_marginLeft="3dip" android:background="@drawable/dot"/> <View android:id="@+id/dot_1" android:layout_height="5dip" android:layout_width="5dip" android:layout_marginRight="3dip" android:layout_marginLeft="3dip" android:background="@drawable/dot_1"/> <View android:id="@+id/dot_2" android:layout_height="5dip" android:layout_width="5dip" android:layout_marginRight="3dip" android:layout_marginLeft="3dip" android:background="@drawable/dot_1"/> <View android:id="@+id/dot_3" android:layout_height="5dip" android:layout_width="5dip" android:layout_marginRight="3dip" android:layout_marginLeft="3dip" android:background="@drawable/dot_1"/> <View android:id="@+id/dot_4" android:layout_height="5dip" android:layout_width="5dip" android:layout_marginRight="3dip" android:layout_marginLeft="3dip" android:background="@drawable/dot_1"/> </LinearLayout> </LinearLayout> </FrameLayout> </RelativeLayout>
重要的部分還是如何去實現這個過程...這個過程的實現就再下面的代碼中,詳細解釋也在代碼當中...
package com.example.picture_change; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.Map.Entry; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.annotation.SuppressLint; import android.app.Activity; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; /* * HashMap存儲的鍵是不允許重復的...但是值是可以重復的... * * */ public class MainActivity extends Activity { ArrayList<ImageView> imageSource=null; //存放圖像控件... ArrayList<View> dots=null; //存放5個點... int []images=null; //存放圖像的資源... String []titles=null; //伴隨著圖像的變動,標題也會隨之變動... TextView tv=null; //TextView來來顯示title的變化... ViewPager viewpager; //ViewPager來完成滑動效果... MyPagerAdapter adapter; //適配器... Map<String, Object>map=new HashMap<String, Object>(); @SuppressLint("UseSparseArrays") Map<Integer,Object>mapValues=new HashMap<Integer, Object>(); private int curr=0; private int old=0; int o=0; int mapsize; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(MainActivity.this, "a", Toast.LENGTH_LONG).show(); /* 下面利用反射來完成Drawable的資源獲取... * 在這裡我獲取了5張圖片的資源數據..這5張圖片分別為a.jpg b.jpg c.jpg d.jpg e.jpg * 這裡使用了一個length<=1來完成數據的獲取...其實這個方式並不好,是我自己想出來的... * 暫時沒有更好的方法...我這裡使用反射的目的在下面會進行介紹... * */ Field [] field=R.drawable.class.getFields(); for(Field f:field){ if(f.getName().length()<=1){ try { o++; String str="image"+"_"+o; map.put(str, f.getInt(R.drawable.class));//使用map以鍵值對的形式來保存圖片的數據資源... } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } mapsize=map.size()-1; /* 這裡我再次使用了一個map以鍵值對的形式只保存上一個map的Value值... * 這麼做的目的在下面進行說明... * * */ for(Entry<String, Object> entry:map.entrySet()){ mapValues.put(mapsize, entry.getValue()); mapsize--; } init(); } public void init(){ //數據信息的初始化... images=new int[]{R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e}; titles=new String[]{"this is the one picture","this is two picture","this is three picture","this is four picture","this is five picture"}; imageSource=new ArrayList<ImageView>(); //這裡初始化imageSource... for(int i=0;i<images.length;i++){ ImageView iamgeview =new ImageView(this); iamgeview.setBackgroundResource(images[i]); imageSource.add(iamgeview); } //這裡使用了一個方法...我們沒有必要一次一次的findViewById()...使用下面的方法很有效的解決了多次findViewById()函數的引用... dots=new ArrayList<View>(); for(int j=0;j<5;j++){ String dotid="dot"+"_"+j; int resId=getResources().getIdentifier(dotid, "id", "com.example.picture_change"); dots.add(findViewById(resId)); } tv=(TextView) findViewById(R.id.tv); tv.setText(titles[0]); viewpager=(ViewPager) findViewById(R.id.vp); adapter=new MyPagerAdapter(); //這裡定義了一個適配器對象... viewpager.setAdapter(adapter); //傳遞對象,綁定適配器... viewpager.setOnPageChangeListener(new onpagelistener()); //這裡設置了一個當圖片發生滑動後的一個監聽效果... ScheduledExecutorService scheduled = Executors.newSingleThreadScheduledExecutor();//這裡我們開啟一個線程... scheduled.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub curr=(curr+1)%images.length; handler.sendEmptyMessage(0);//將信息發送給Handler,讓Handler處理數據,完成一些操作... } }, 2, 2, TimeUnit.SECONDS); //實現內部方法,設置播放時間... } private class MyPagerAdapter extends PagerAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return images.length; } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub //判斷前後兩張的顯示圖片是否相同... return arg0==arg1; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //銷毀...釋放內存... container.removeView(imageSource.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { /* 這個方法表示的是滑動到了第幾張圖片的定位...通過傳遞一個ViewGroup來完成數據的傳遞... * 我們上面使用到了一個Map來保存上一個Map的Value值,這個的真正目的就在這裡..目的是為了 * 獲取當前顯示圖片的資源信息..說白了就是要獲取(R.drawable.屬性),為什麼要實現這個目的 * 因為我們要實現,當這個顯示的圖片被點擊的時候,我們應該進行哪些操作... * */ ImageView v=imageSource.get(position);//獲取當前圖片... //position是從0-4的值...因此可以獲取到Map中的值了... v.setClickable(true); //設置圖片是可以點擊的... final int values=(Integer)mapValues.get(position); //這裡我們獲取map中保存的Values值... System.out.println(values); //下面就是實現觸發圖片時的監聽... v.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch(values){ case R.drawable.a: Toast.makeText(MainActivity.this, "a", Toast.LENGTH_LONG).show(); break; case R.drawable.b: Toast.makeText(MainActivity.this, "b", Toast.LENGTH_LONG).show(); break; case R.drawable.c: Toast.makeText(MainActivity.this, "c", Toast.LENGTH_LONG).show(); break; case R.drawable.d: Toast.makeText(MainActivity.this, "d", Toast.LENGTH_LONG).show(); break; case R.drawable.e: Toast.makeText(MainActivity.this, "e", Toast.LENGTH_LONG).show(); break; } } }); container.addView(imageSource.get(position)); //將所有的圖片都加載到了container中... return imageSource.get(position); } } //定義一個內部類實現圖片在變化的時候的監聽... class onpagelistener implements OnPageChangeListener{ @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub //當發生滑動後,要完成的一些相應操作... tv.setText(titles[arg0]); dots.get(arg0).setBackgroundResource(R.drawable.dot); dots.get(old).setBackgroundResource(R.drawable.dot_1); old=arg0; curr=arg0; } } @SuppressLint("HandlerLeak") private Handler handler=new Handler(){ public void handleMessage(Message msg) { //接收到消息後,更新頁面 viewpager.setCurrentItem(curr); }; }; @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; } }
這裡我使用了反射機制來獲取Drawable的圖像資源,然後通過switch方法來完成了當圖片被點擊的時候需要完成的操作...這是筆者我自己想出來的一種方法...因為Android沒有提供ImageClickListener()這類的方法,因此我們只能夠自己去進行書寫圖片被點擊的方法...至於更好的方法,我是還沒有發現...也是確實是能力有限制了,這個方法今天也想了整整一個下午才折騰出來的... 注意:給自己的一個提醒,HashMap的鍵是絕對不能夠重復保存的...但是值是可以保存重復的數據的,如果保存了重復的鍵,那麼在map只會保存第一個數據,不會對後續數據進行保存...這個也是一個很大的注意點,自己就栽這裡很久,雖然很低級的錯誤,但是很有可能在不注意的情況下就犯下了...因此在這裡也算是給自己提個醒...下次不會再犯下這樣的錯誤的..
先看看效果: 首先,導入包:compile files(libs/nineoldandroids-2.4.0.jar)r然後在main中創建一個widget包。 c創建V
我們在平時開發時經常要用到各種顏色,有了下面這兩張表,媽媽再也不用擔心你的配色問題了。 一:內置顏色: public stati
如題,經過三四天的開發嘗試已經初步成型,下面是簡陋的界面圖: 上圖是做的藍牙串口服務的收發界面,主要用於平時的調試之用,由於開發的初衷是為了實現藍牙對單片機的控制,因
Launcher也是一個普通的應用程序,只不過在主入口中加入<>屬性,這樣在開機啟動後,就會首先找到這個應用,第一個加載。那分析Launcher的加載流程時,