Android学习笔记のピクチャー...
35258 ワード
PS:1つのバグがまた1つの午后を振り回しました....ああ...
学習内容:
1.AndroidはViewPagerとPagerAdapterを利用して画像の再放送を実現...
2.反射メカニズムを使用してAndroidのリソース情報を取得...
画像の轮播は非常に一般的なアニメーション効果で、appでもよく使われる効果です.ここでは简単にこの机能を実现します.Androidでは画像の轮播を実现するには、ViewPagerというコントロールを使う必要があります.このコントロールの主な机能は画像のスライド効果を実现することです.スライドができるようになり、スライドの上に画像を添付することで、画像の轮播効果が実现します...このコントロールはListViewに似ています.アダプタというものを使用する必要があります.アダプタはここで、マルチキャスト時にいくつかの効果を設定する役割を果たしています.ここではPagerAdapterアダプタを使用する必要があります...次の例では、この例の効果は、画像の再生と同時に再生された何枚目の画像の情報を表示することです...そして次の点も変化します...
まずレイアウトファイルのコードを...このレイアウトファイルは実はちょっと言いましたが…この言葉は導入しなければなりません...エラーが発生します...スライド効果を設定しました.この効果はFrameLayout全体を埋めます.各Viewは、別のxmlファイルに表示されるコントロールを表します.次は2つのxmlファイルです...
上はxmlファイルを配置することによってViewの表示方式を完成して、この5つの点の形状、大きさ、甚だしきに至っては表示方式は基本的にすべて同じで、もし更に5つの点のピクチャーあるいは1つの点のピクチャーを探して、それからDrawable資源の呼び出しを通じてピクチャーの表示を完成します...5回ロードすることで...これは明らかに必要ありません.不要な資源を浪費します.xmlが提供するカスタムグラフィックを使用して、このプロセスを完了することができます.xmlはshapeプロパティ、カスタムコントロールを提供します.ここでは実心円を定義しました...この実心円は画像のスライドに伴って完成し、この点もそれに応じて変化します...理解しにくいものではないように見えますが...
重要な部分はどうやってこの過程を実現するか...このプロセスの実装は次のコードで、詳細な説明もコードの中にあります...
ここでは、Drawableの画像リソースを取得するために反射メカニズムを使用し、画像がクリックされたときに完了する必要がある操作をswitch法で完了しました.これは筆者自身が思いついた方法です...AndroidはImageClickListener()のような方法を提供していないので、私たちは自分で画像を書くことしかできません.もっと良い方法については、私はまだ発見していません.确かに能力に制限があったのですが、この方法は今日も丸1日午后になってやっと振り回すことができました...
注意:HashMapのキーは絶対に繰り返し保存できません...ただし、値は重複するデータを保存できます.重複するキーが保存されている場合、mapには最初のデータしか保存されず、後続のデータは保存されません...これも大きな注意点で、自分がここに長い間植えていたので、低級な間違いでしたが、気づかずに犯した可能性が高い...だからここでも目が覚めるように...次は二度とこんなミスを犯さない.
要するに、上記のコードはAndroidの画像の輪番放送のアニメーション効果を完成しました...
学習内容:
1.AndroidはViewPagerとPagerAdapterを利用して画像の再放送を実現...
2.反射メカニズムを使用してAndroidのリソース情報を取得...
画像の轮播は非常に一般的なアニメーション効果で、appでもよく使われる効果です.ここでは简単にこの机能を実现します.Androidでは画像の轮播を実现するには、ViewPagerというコントロールを使う必要があります.このコントロールの主な机能は画像のスライド効果を実现することです.スライドができるようになり、スライドの上に画像を添付することで、画像の轮播効果が実现します...このコントロールはListViewに似ています.アダプタというものを使用する必要があります.アダプタはここで、マルチキャスト時にいくつかの効果を設定する役割を果たしています.ここではPagerAdapterアダプタを使用する必要があります...次の例では、この例の効果は、画像の再生と同時に再生された何枚目の画像の情報を表示することです...そして次の点も変化します...
まずレイアウトファイルのコードを...このレイアウトファイルは実はちょっと言いましたが…
<?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つの点の形状、大きさ、甚だしきに至っては表示方式は基本的にすべて同じで、もし更に5つの点のピクチャーあるいは1つの点のピクチャーを探して、それから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()のような方法を提供していないので、私たちは自分で画像を書くことしかできません.もっと良い方法については、私はまだ発見していません.确かに能力に制限があったのですが、この方法は今日も丸1日午后になってやっと振り回すことができました...
注意:HashMapのキーは絶対に繰り返し保存できません...ただし、値は重複するデータを保存できます.重複するキーが保存されている場合、mapには最初のデータしか保存されず、後続のデータは保存されません...これも大きな注意点で、自分がここに長い間植えていたので、低級な間違いでしたが、気づかずに犯した可能性が高い...だからここでも目が覚めるように...次は二度とこんなミスを犯さない.
要するに、上記のコードはAndroidの画像の輪番放送のアニメーション効果を完成しました...