① android 如何重寫imageview 讓圖片有圓角效果
android 自定義圓角ImageView以及鋸齒的處理
看到很多人開發過程中要使用圓角圖片時,解決方法有:
1.重新繪制一張圖片
2.通過布局來配置
3.通過重寫View來實現
其中1,2在這里就不講了,重點講講方法三的實現。
實現一:通過截取畫布一個圓形區域與圖片的相交部分進行繪制,缺點:鋸齒明顯,設置Paint,Canvas抗鋸齒無效。
package com.open.circleimageview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.View;
public class CircleImageViewA extends View {
public CircleImageViewA(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CircleImageViewA(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CircleImageViewA(Context context) {
super(context);
}
private Bitmap bitmap;
private Rect bitmapRect=new Rect();
private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
private Paint paint = new Paint();
{
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);// 設置畫筆的鋸齒效果。 true是去除,大家一看效果就明白了
}
private Path mPath=new Path();
public void setImageBitmap(Bitmap bitmap)
{
this.bitmap=bitmap;
}
@Override
protected void onDraw(Canvas canvas) {
if(null==bitmap)
{
return;
}
bitmapRect.set(0, 0, getWidth(), getHeight());
canvas.save();
canvas.setDrawFilter(pdf);
mPath.reset();
canvas.clipPath(mPath); // makes the clip empty
mPath.addCircle(getWidth()/2, getWidth()/2, getHeight()/2, Path.Direction.CCW);
canvas.clipPath(mPath, Region.Op.REPLACE);
canvas.drawBitmap(bitmap, null, bitmapRect, paint);
canvas.restore();
}
}
實現二:通過PorterDuffXfermode 方式(注意要設置硬體加速,否則部分機子無效),優點:鋸齒基本沒有
package com.open.circleimageview.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleImageViewB extends View {
public CircleImageViewB(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public CircleImageViewB(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleImageViewB(Context context) {
super(context);
init();
}
private Bitmap bitmap;
private Rect bitmapRect=new Rect();
private PaintFlagsDrawFilter pdf=new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
private Paint paint = new Paint();
{
paint.setStyle(Paint.Style.STROKE);
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(true);// 設置畫筆的鋸齒效果。 true是去除,大家一看效果就明白了
}
private Bitmap mDstB=null;
private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
private void init()
{
try {
if(android.os.Build.VERSION.SDK_INT>=11)
{
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void setImageBitmap(Bitmap bitmap)
{
this.bitmap=bitmap;
}
private Bitmap makeDst(int w, int h)
{
Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bm);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(Color.parseColor("#ffffffff"));
c.drawOval(new RectF(0, 0, w, h), p);
return bm;
}
@Override
protected void onDraw(Canvas canvas) {
if(null==bitmap)
{
return;
}
if(null==mDstB)
{
mDstB=makeDst(getWidth(), getHeight());
}
bitmapRect.set(0, 0, getWidth(), getHeight());
canvas.save();
canvas.setDrawFilter(pdf);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(xfermode);
canvas.drawBitmap(bitmap, null, bitmapRect, paint);
paint.setXfermode(null);
canvas.restore();
}
}
② android怎麼viewpager實現循環切換圖片
Android中的ViewPager則實現了左右滑動的效果,ViewPager類提供了多界面切換的新效果。利用ViewPager實現圖片循環滾動代碼如下:
1、首先是布局文件,使用了一個ViewPager控制項:
java"><spanstyle="padding:0px;margin:0px;font-size:14px;"><RelativeLayoutxmlns: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">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="第一個引導頁面"
android:textColor="@android:color/white"
android:textSize="14sp"/>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout></span>
2、接下來實現一個繼承PagerAdapter的MyAdapter類,實現一個PagerAdapter,代碼如下:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
{
privateList<ImageView>mImageViewList;
publicViewPagerAdapter(List<ImageView>imageViewList){
super();
this.mImageViewList=imageViewList;
}
/**
*該方法將返回所包含的Item總個數。為了實現一種循環滾動的效果,返回了基本整型的最大值,這樣就會創建很多的Item,
*其實這並非是真正的無限循環。
*/
@Override
publicintgetCount(){
returnInteger.MAX_VALUE;
}
/**
*判斷出去的view是否等於進來的view如果為true直接復用
*/
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
/**
*銷毀預載入以外的view對象,會把需要銷毀的對象的索引位置傳進來,就是position,
*因為mImageViewList只有五條數據,而position將會取到很大的值,
*所以使用取余數的方法來獲取每一條數據項。
*/
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mImageViewList.get(position%mImageViewList.size()));
}
/**
*創建一個view,
*/
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(mImageViewList.get(position%mImageViewList.size()));
returnmImageViewList.get(position%mImageViewList.size());
}
}
</span>
3、最後是主界面部分的代碼:
<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.SystemClock;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.LinearLayout.LayoutParams;
importandroid.widget.TextView;
{
privateList<ImageView>imageViewList;
privateTextViewtvDescription;
privateLinearLayoutllPoints;
privateString[]imageDescriptions;
=0;
privateViewPagermViewPager;
privatebooleanisLoop=true;
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
}
};
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setView();
initView();
}
publicvoidsetView(){
setContentView(R.layout.activity_splash_viewpager);
//自動切換頁面功能
newThread(newRunnable(){
@Override
publicvoidrun(){
while(isLoop){
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
}
}).start();
}
publicvoidinitView(){
mViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
llPoints=(LinearLayout)findViewById(R.id.ll_points);
prepareData();
ViewPagerAdapteradapter=newViewPagerAdapter(imageViewList);
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(this);
tvDescription.setText(imageDescriptions[previousSelectPosition]);
llPoints.getChildAt(previousSelectPosition).setEnabled(true);
/**
*2147483647/2=1073741820-1
*設置ViewPager的當前項為一個比較大的數,以便一開始就可以左右循環滑動
*/
intn=Integer.MAX_VALUE/2%imageViewList.size();
intitemPosition=Integer.MAX_VALUE/2-n;
mViewPager.setCurrentItem(itemPosition);
}
privatevoidprepareData(){
imageViewList=newArrayList<ImageView>();
int[]imageResIDs=getImageResIDs();
imageDescriptions=getImageDescription();
ImageViewiv;
Viewview;
for(inti=0;i<imageResIDs.length;i++){
iv=newImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
//添加點view對象
view=newView(this);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.point_background));
LayoutParamslp=newLayoutParams(5,5);
lp.leftMargin=10;
view.setLayoutParams(lp);
view.setEnabled(false);
llPoints.addView(view);
}
}
privateint[]getImageResIDs(){
returnnewint[]{
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.pic_01,
R.drawable.pic_02
};
}
privateString[]getImageDescription(){
returnnewString[]{
"第一個引導頁面",
"第二個引導頁面",
"第三個引導頁面",
"第四個引導頁面",
"第五個引導頁面"
};
}
@Override
(intarg0){
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageSelected(intposition){
//改變圖片的描述信息
tvDescription.setText(imageDescriptions[position%imageViewList.size()]);
//切換選中的點,把前一個點置為normal狀態
llPoints.getChildAt(previousSelectPosition).setEnabled(false);
//把當前選中的position對應的點置為enabled狀態
llPoints.getChildAt(position%imageViewList.size()).setEnabled(true);
previousSelectPosition=position%imageViewList.size();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
isLoop=false;
}
}
</span>
③ android 如何實現圖片視頻混合播放啊
直接上代碼:
布局文件就是兩個全屏的videoview和imageview重疊
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/pictureView"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
java部分:
/*
視頻圖片混合展示demo
*/
packagecom.example.administrator.hunbo;
importandroid.content.Context;
importandroid.media.MediaPlayer;
importandroid.net.Uri;
importandroid.os.Handler;
importandroid.os.storage.StorageManager;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.Toast;
importandroid.widget.VideoView;
importjava.io.File;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;
importjava.util.ArrayList;
{
privateVideoViewvideoView;
privateImageViewpictureView;
booleanisPlaying=false;
privateArrayListarrayList=newArrayList<String>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().hide();//隱藏actionBar
//初始化控制項
videoView=findViewById(R.id.videoView);
pictureView=findViewById(R.id.pictureView);
//最開始兩個view都是隱藏的
videoView.setVisibility(View.GONE);
pictureView.setVisibility(View.GONE);
//檢測SD卡是否存在
String[]result=null;
StorageManagerstorageManager=(StorageManager)getSystemService(Context.STORAGE_SERVICE);
try{
Methodmethod=StorageManager.class.getMethod("getVolumePaths");
method.setAccessible(true);
try{
result=(String[])method.invoke(storageManager);
}catch(InvocationTargetExceptione){
e.printStackTrace();
}
if(result.length>1){
//Toast.makeText(this,"檢測到U盤",Toast.LENGTH_SHORT).show();
AllFilesPath("/mnt/usb/");
playList();
}else{
Toast.makeText(this,"未檢測到U盤,請在開機前插入U盤,或者重新啟動此應用",Toast.LENGTH_SHORT).show();
Handlerhandler=newHandler();
handler.postDelayed(newRunnable(){
@Override
publicvoidrun(){
finish();
}
},2500);
}
}catch(Exceptione){
e.printStackTrace();
}
}
//獲取所有圖片視頻的絕對路徑到arraylist
privateArrayListAllFilesPath(Stringpath){
Filefile=newFile(path);
File[]files=file.listFiles();
for(Filef:files){
if(f.getName().endsWith("jpg")||f.getName().endsWith("jpeg")||f.getName().endsWith("mp4")
||f.getName().endsWith("avi")||f.getName().endsWith("mkv")||f.getName().endsWith("rmvb")
||f.getName().endsWith("flv")){
System.out.println("------------獲取到了一個可用路徑:"+f.getAbsolutePath());
arrayList.add(f.getAbsolutePath());//添加到arralist
}elseif(f.isDirectory()){
AllFilesPath(f.getAbsolutePath());
}
}
returnarrayList;
}
//依次混合播放arralist里的圖片或視頻
publicintlistNum;
privatevoidplayList(){
if(listNum>=arrayList.size()){
finish();
//listNum=0;
}else{
System.out.println("---------------------------收入路徑---------------------------");
System.out.println("isplaying="+isPlaying);
finalFilef=newFile(arrayList.get(listNum).toString());
if(f.getName().endsWith("jpg")||f.getName().endsWith("jpeg")||f.getName().endsWith("png")){
System.out.println("---------------------------添加了一張圖片:"+f.getAbsolutePath());
pictureView.setVisibility(View.VISIBLE);
pictureView.setImageURI(Uri.fromFile(f));
Handlerhandler=newHandler();
handler.postDelayed(newRunnable(){
@Override
publicvoidrun(){
System.out.println("---------------------------播完了一張位於"+f.getAbsolutePath()+"的圖片》》》》》》》》》》》》》》》》》");
pictureView.setVisibility(View.GONE);
listNum++;
playList();
}
},2000);//2秒後結束當前圖片
}elseif(f.getName().endsWith("mp4")||f.getName().endsWith("avi")||f.getName().endsWith("mkv")
||f.getName().endsWith("rmvb")||f.getName().endsWith("flv")){
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~添加了一個視頻"+f.getAbsolutePath());
videoView.setVideoPath(f.getAbsolutePath());
videoView.setVisibility(View.VISIBLE);//播放之前顯示videoView
videoView.start();
videoView.setOnCompletionListener(newMediaPlayer.OnCompletionListener(){
@Override
publicvoidonCompletion(MediaPlayermp){
System.out.println("---------------------------播完了一個位於"+f.getAbsolutePath()+"的視頻《《《《《《《《《《《《《《《《《《");
videoView.setVisibility(View.GONE);//視頻播放完畢後隱藏videoView
listNum++;
playList();
}
});
}
}
}
④ Androidwidget這個是什麼老彈出來讓我下一些軟體,我卸載了它它還自動
我也遇到相同的問題,總是卸載了又在我不知道的情況下自動安裝上去了,還總是彈出廣告,經常不小心點到它突然彈出的廣告導致自動下載了,一個月的流量有三分之一是被它用掉的,煩死了。簡直是流氓插件!
我就想這東西是聯網就自動安裝的,我沒辦法徹底鏟除,那就裝著,我不刪你吧,但你的廣告我總要關掉,我在管理軟體和流量控制裡面把它的wifi聯網和2G/3G聯網全部都關了,看他哪裡來的廣告源。
待觀察中。。。。。。
————
不知道其他人解決得如何了,我關掉它的聯網後覺得廣告頻率少很多了,但偶爾還是有出來。
已經是用了三年多的手機了,早想換一個。
⑤ android浣跨敤ViewPager瀹炵幇杞鎾鏁堟灉鏁欑▼
ViewPager錛氫竴涓鍙浠ュ疄鐜拌嗗浘宸﹀彸婊戝姩鍒囨崲鐨勬帶浠躲
ViewPager鐨勫熀鏈浣跨敤錛
ViewPager鐨勮嗗浘闇瑕侀氳繃PagerAdapter鏉ュ疄鐜版樉紺恆
PagerAdapter鐨勪富瑕佹柟娉曪細
鈼 getCount 瑙嗗浘鐨勬暟閲
鈼 instantiateItem 娣誨姞瑙嗗浘
鈼 destroyItem 閿姣佽嗗浘
鈼 isViewFromObject 鏄鍚︾敱瀵硅薄鍒涘緩瑙嗗浘
ViewPager鐨勫父鐢ㄦ柟娉曪細
setAdapter 璁劇疆閫傞厤鍣
addOnPageChangeListener 鐩戝惉欏甸潰鍒囨崲鐨勭姸鎬
setCurrentItem 璁劇疆褰撳墠欏甸潰鐨勭儲寮
瀹炵幇騫垮憡杞鎾
鎶鏈鐐瑰垎鏋愶細
1銆佺綉緇滆繛鎺
2銆丣SON瑙f瀽
3銆乂iewPager鐨勫垵濮嬪寲
4銆佸浘鐗囩殑寮傛ュ姞杞
5銆佸渾鐐規寚紺哄櫒鐨勫疄鐜
浣跨敤selector+shape瀹炵幇鍦嗙偣鍥劇墖
鍔ㄦ佸壋寤篒mageView娣誨姞鍒伴泦鍚堜腑錛屽悓鏃舵坊鍔犲埌甯冨矓涓
鍦╒iewPager鍒囨崲浜嬩歡涓錛屽垏鎹㈠渾鐐圭姸鎬
6銆佽嚜鍔ㄥ垏鎹㈡晥鏋
浣跨敤Handler鐨刾ost鏂規硶錛屽畾鏃舵墽琛屼唬鐮
璧勬簮鏂囦歡錛
mydot.xml //鍒涘緩鍦嗙偣璧勬簮錛屾斁鍦╠rawable鏂囦歡涓
甯冨矓鏂囦歡錛
activity_main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_list" /
activity_banner.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/vp_image"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:layout_gravity="center" /
android:layout_width="match_parent"
android:layout_height="40dp"
android:id="@+id/layout"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="horizontal"
java浠g爜
ImageLoader.java //璇ヤ唬鐮佹槸閫氳繃URL鑾峰彇鍥劇墖璧勬簮
package cn.e.huse.banner_re.util;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 鍥劇墖鍔犺澆鐨勫伐鍏風被
* @author xray
*
*/
public class ImageLoader {
/**
* 鍥劇墖鍔犺澆瀹屾垚鐨勫洖璋冩帴鍙
* 娣誨姞URL鍙傛暟錛岀敤浜庡仛鍥劇墖閿欎綅鍒ゆ柇
*/
public interface OnImageLoadListener{
//瀹屾垚鍥劇墖鍔犺澆
void onImageLoadComplete(String url, Bitmap bitmap);
}
private OnImageLoadListener mListener;
/**
* 鍚鍔ㄥ浘鐗囧姞杞戒換鍔
* @param urlStr
* @param listener
*/
public void loadImage(String urlStr,OnImageLoadListener listener){
this.mListener = listener;
new ImageLoadTask().execute(urlStr);
}
/**
* 鍥劇墖鍔犺澆浠誨姟
* @author xray
*
*/
class ImageLoadTask extends AsyncTask
@Override
protected UrlAndBitmap doInBackground(String... params) {
try {
//鍒涘緩URL錛屾寚瀹氬浘鐗囧湴鍧
URL url = new URL(params[0]);
//鎵撳紑榪炴帴鑾峰緱HttpURLConnection瀵硅薄
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//鑾峰緱鏂囦歡杈撳叆嫻
InputStream stream = conn.getInputStream();
//鎶婅緭鍏ユ祦杞鎹涓哄浘鐗
Bitmap bmp = BitmapFactory.decodeStream(stream);
//鍏抽棴嫻
stream.close();
return new UrlAndBitmap(params[0],bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//鍖呰呭浘鐗囧湴鍧鍜屽浘鐗
class UrlAndBitmap{
String url;
Bitmap bitmap;
public UrlAndBitmap(String url, Bitmap bitmap) {
this.url = url;
this.bitmap = bitmap;
}
}
@Override
protected void onPostExecute(UrlAndBitmap result) {
//榪涜屾帴鍙e洖璋
if(mListener != null){
mListener.onImageLoadComplete(result.url,result.bitmap);
}
}
}
}
JSONLoader.java
//璇誨彇鏈嶅姟鍣╦son
package cn.e.huse.banner_re.util;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 璇誨彇鏈嶅姟鍣↗SON鐨勫伐鍏風被
* @author xray
*
*/
public class JSONLoader {
public interface OnJSONLoadListener{
void onJSONLoadComplete(String json);
}
private OnJSONLoadListener mListener;
public void loadJSON(String urlStr,OnJSONLoadListener listener){
this.mListener = listener;
new JSONLoadTask().execute(urlStr);
}
class JSONLoadTask extends AsyncTask
@Override
protected String doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inputStream = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//StringBuffer 綰跨▼瀹夊叏錛屾ц兘浣 VS StringBuilder 綰跨▼涓嶅畨鍏錛屾ц兘楂
StringBuilder strB = new StringBuilder();
while((len = inputStream.read(buffer)) != -1){
//灝嗗瓧鑺傜爜杞鎹涓篠tring
String str = new String(buffer,0,len);
strB.append(str);
}
inputStream.close();
return strB.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
if(mListener != null){
mListener.onJSONLoadComplete(result);
}
}
}
}
MyViewPagerAdapter.java
package cn.e.huse.banner_re.adapter;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
/**
* 鍥劇墖杞鎾鐨勯傞厤鍣
* @author Lenovo
*
*/
public class MyViewPagerAdapter extends PagerAdapter {
private List mData;
public MyViewPagerAdapter(List mData) {
this.mData = mData;
}
//榪斿洖瑙嗗浘鐨勬暟閲
@Override
public int getCount() {
return mData.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
//閿姣佸浘鐗
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mData.get(position));
}
//娣誨姞鍥劇墖
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mData.get(position));
return mData.get(position);
}
}
MainActivity.java
package cn.e.huse.banner_re;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import cn.e.huse.banner_re.adapter.MyViewPagerAdapter;
import cn.e.huse.banner_re.util.ImageLoader;
import cn.e.huse.banner_re.util.ImageLoader.OnImageLoadListener;
import cn.e.huse.banner_re.util.JSONLoader;
import cn.e.huse.banner_re.util.JSONLoader.OnJSONLoadListener;
public class MainActivity extends Activity implements OnClickListener{
public static final String URL_GIFT = "http://www.1688wan.com/majax.action?method=getGiftListpageno=1";
public static final String URL_BASE = "http://www.1688wan.com";
private ListView mLv;
//鏀劇疆鍦嗙偣鍥劇墖鐨勫竷灞
private LinearLayout mLayout;
private ViewPager mPager;
//淇濆瓨viewpager涓婂浘鐗囩殑闆嗗悎
private List mImageViews;
//淇濆瓨鍦嗙偣鍥劇墖鐨勯泦鍚
private List mDotViews;
//褰撳墠鍥劇墖
private ImageView mDotView;
//褰撳墠涓嬫爣
private int mIndex;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//鍒濆嬪寲viewpager
initViewPager();
}
private void initViewPager() {
new JSONLoader().loadJSON(URL_GIFT, new OnJSONLoadListener() {
@Override
public void onJSONLoadComplete(String json) {
//寰楀埌鍥劇墖鐨勫湴鍧
List list = josnPare(json);
//鍒濆嬪寲涓繪帶浠
initView();
//灝嗗浘鐗囨樉紺哄埌viewpager涓
initImageViews(list);
//涓篤iewPager璁劇疆閫傞厤鍣
mPager.setAdapter(new MyViewPagerAdapter(mImageViews));
//鍔犺澆鍦嗙偣鍥劇墖
initDot(mImageViews.size());
//瀹炵幇鍥劇墖鐨勮疆鎾
mPager.postDelayed(new Runnable() {
@Override
public void run() {
//涓嬫爣鑷鍔++
mIndex++;
//褰撲笅鏍囧埌鏈鍚庢椂錛屽氨閲嶆柊鏉ヨ繃
if(mIndex = mImageViews.size()){
mIndex = 0;
}
//璁劇疆鍥劇墖
mPager.setCurrentItem(mIndex);
//閲嶅嶈皟鐢
mHandler.postDelayed(this, 1500);
}
}, 1500);
//娣誨姞欏電爜婊戝姩鐨勭洃鍚錛屽疄鐜板渾鐐瑰浘鐗囩殑鍒囨崲
mPager.setOnPageChangeListener(new OnPageChangeListener() {
//欏甸変腑鍚庤皟鐢
@Override
public void onPageSelected(int arg0) {
//鏀瑰彉鍘熸潵鐨勫渾鐐瑰浘鐗囩殑鐘舵
mDotView.setEnabled(true);
//鏇存柊褰撳墠鐨勫渾鐐瑰浘鐗
mDotView = mDotViews.get(arg0);
//灝嗗綋鍓嶉変腑鐨勫渾鐐硅句負閫変腑鐘舵
mDotView.setEnabled(false);
//鏇存柊涓嬫爣
mIndex = arg0;
}
//婊戝姩涓閫旇皟鐢
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
//欏甸潰婊戝姩鐘舵佷慨鏀
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
});
}
/**鑾峰彇鍦嗙偣鍥劇墖鍑芥暟
* @param count viewpager涓婂浘鐗囩殑鏁伴噺
*/
private void initDot(int count){
mDotViews = new ArrayList();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//璁劇疆杈硅窛
params.setMargins(5, 0, 5, 0);
for(int i = 0; i count; i++){
ImageView image = new ImageView(this);
//璁劇疆鍦嗙偣鍥劇墖
image.setImageResource(R.drawable.mydot);
//璁劇疆鍥劇墖鐨勪綅緗錛屾柟渚垮悗闈㈢殑鍙栧
image.setTag(i);
//璁劇疆鐩戝惉
image.setOnClickListener(this);
//娣誨姞鍒板竷灞涓
mLayout.addView(image, params);
//灝嗗渾鐐瑰浘鐗囦繚瀛樺埌闆嗗悎涓
mDotViews.add(image);
}
mDotView = mDotViews.get(0);
mDotView.setEnabled(false);
}
/**
*鏄劇ず鍥劇墖鐨勫嚱鏁
*/
private void initImageViews(List list) {
mImageViews = new ArrayList();
for(String str : list){
final ImageView imageView = new ImageView(this);
//璁劇疆榛樿ゅ浘鐗
imageView.setImageResource(R.drawable.ic_launcher);
new ImageLoader().loadImage(URL_BASE+str, new OnImageLoadListener() {
@Override
public void onImageLoadComplete(String url, Bitmap bitmap) {
if(bitmap != null){
imageView.setImageBitmap(bitmap);
}
}
});
//灝咺mageView淇濆瓨鍒伴泦鍚堜腑
mImageViews.add(imageView);
}
}
/**
* JSON瑙f瀽鑾峰彇鍥劇墖鐨勫湴鍧
* @param url
* @return
*/
private List josnPare(String url){
List list = new ArrayList();
try {
JSONObject jobj = new JSONObject(url);
JSONArray array = jobj.getJSONArray("ad");
for(int i = 0; i array.length(); i++){
JSONObject obj = (JSONObject) array.get(i);
list.add(obj.getString("iconurl"));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 鍒濆嬪寲鎺т歡
*/
private void initView() {
//鎵懼埌鎺т歡
mLv = (ListView) findViewById(R.id.lv_list);
View view = LayoutInflater.from(this).inflate(R.layout.activity_banner, null);
mPager = (ViewPager)view.findViewById(R.id.vp_image);
//鍦嗙偣鍥劇墖甯冨矓
mLayout = (LinearLayout)view.findViewById(R.id.layout);
//妯℃嫙鏁版嵁
List mList = new ArrayList();
for(int i = 0; i 20; i++){
mList.add("鏉$洰--"+i);
}
//鍒涘緩閫傞厤鍣
ArrayAdapter mAdapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
mList);
//璁劇疆澶撮儴瑙嗗浘
mLv.addHeaderView(view);
//璁劇疆閫傞厤鍣
mLv.setAdapter(mAdapter);
/*//鍦嗙偣鍥劇墖甯冨矓
mLayout = (LinearLayout)findViewById(R.id.layout);*/
}
/**
* 鍦嗙偣鍥劇墖鐨勭洃鍚浜嬩歡
*/
@Override
public void onClick(View arg0) {
//鑾峰彇璇ュ渾鐐瑰浘鐗囩殑浣嶇疆
int index = Integer.parseInt(arg0.getTag().toString());
//灝唙iewpager鐨勫浘鐗囨樉紺烘垚涓嬫爣涓篿ndex鐨勫浘鐗
mPager.setCurrentItem(index);
//灝嗗師鏉ョ殑璁劇疆鎴愰粯璁ゅ
mDotView.setEnabled(true);
//淇濆瓨鏂扮殑鍊
mDotView = (ImageView) arg0;
//灝嗘柊鐨勫兼敼鍙樻垚false
mDotView.setEnabled(false);
//鏇存柊涓嬫爣
mIndex = index;
}
}
娉ㄦ剰錛氬洜涓鴻繖閲岀敤鍒頒簡json瑙f瀽錛岄渶瑕佺敤鍒拌仈緗戞搷浣滐紝涓瀹氳佸啓涓婁笂緗戠殑鏉冮檺錛
銆銆榪愯屾晥鏋滐細
⑥ android 能在屏幕上繪一張小圖片,然後透明背景,還能操作能看到的背景桌面圖標或程序。
package com.qdsx.cml;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
//import android.view.animation.AnimationUtils;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
public class TestdonghuaActivity extends Activity {
private ImageView tweenMM;
// private Animation animation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tweenMM =(ImageView)findViewById(R.id.imageView1);
}
//漸變
public void BtnAlphaOnClick(View view){
//this.doStartAnimation(R.anim.alpha_animation);
Animation b = new AlphaAnimation(0.1f, 1.0f);
b.setDuration(2000);
tweenMM.startAnimation(b);
}
//旋轉
public void BtnrotateOnClick(View view){
//this.doStartAnimation(R.anim.rotate_animation);
Animation c = new RotateAnimation(0, 360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
c.setDuration(3000);
tweenMM.startAnimation(c);
}
//縮放
public void BtnScaleOnClick(View view){
//this.doStartAnimation(R.anim.scale_animation);
Animation d = new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF,0.5f);
d.setDuration(3000);
tweenMM.startAnimation(d);
}
//位移
public void BtnTransalteOnclick(View view){
//this.doStartAnimation(R.anim.translate_animation);
Animation a= new TranslateAnimation(0, 100, 0, 100);
a.setDuration(5000);
a.setFillAfter(true);//使圖片移動後固定
tweenMM.startAnimation(a);
}
//開始動畫方法
/* private void doStartAnimation(int animid){
animation = AnimationUtils.loadAnimation(this, animid);
animation.setFillAfter(true);//使圖片移動後固定
tweenMM.startAnimation(animation);
}*/
}
⑦ androidwidget有用嗎
1.身材微:它們一般都很小,在終端上嵌入非常方便,運行快速。
2.形式多:Widget可以以多種形式呈現出來,幻燈秀、視頻、地圖、新聞、小游戲……
3.功能巨:別看它們小,卻服務周到,它可以為你報告新聞、幫你買東西、列出你最喜歡的樂隊,還有你最近看的視頻。另外,它還是一個殷勤的管家,你不必親自去Flickr或者天氣預報網站,Widget會將信息主動帶給你。
4.姿容麗:它們可以稱得上玉面飛龍、以色服人。只要你願意,你可以把它變成任何你想要得樣子。它的出現,無異於一枚「桌面炸彈」,狹窄而單調的IE窗口將被更為廣闊和絢麗的桌面空間所取代。
5.個性化:Widget更像一個屬於我們每個人的魔方,任由用戶聚合。你可以根據自己喜好,將多個Widget,隨心所欲的去精心組裝你的網路世界。通過Widget,可以用戶把一切在「網」中的內容打亂重來,並按照用戶希望看到的樣子重新排列組合一個屬於自己的互聯網。比如說一個由微件搭建個人空間,可以包括來自新浪的體育新聞,來自論壇的一個板塊,來自權威財經網站的一則隨時更新的股票信息 ——這些以往需要用戶同時分別進入幾個網站才能看到的信息,現在由一個個微件將其轉變為用戶個人空間的一部分,從而可以直接在同一個頁面中並存。傳統互聯網訪問方式處於分裂狀態的後Web2.0時期,多樣性、炫酷且更具個性化的Widget流行,或許能引領一個新的潮流。
6.易製作:製作 Widget 部件並不復雜,只需要熟悉三方面的知識:圖像處理、HTML/XML、java,就可以按照開發站點里的教程做出漂亮的部件來。Widget能夠流行的一個要點在於開放製作,UGC應用帶來爆炸式地增長。
那麼,什麼是android widget呢?
在Android 1.5 SDK preview中,我們看到了一系列功能和API上的變化變化,包括軟鍵盤、桌面Widget和Live Folder API、視頻錄制API,藍牙功能升級等,Google近來對於這些全新功能的解析使得Android開發者blog變得異常活躍。上周,Jeff Sharkey就有一篇對於Android桌面widget和AppWidget框架的簡介,以「Word of the day」的一個例子講述了桌面Widget的運作機制。昨天他又在個人blog上放出了一個天氣預報Widget的例子,事實上這已經是一個真正實用的程序了。它每天更新4次天氣預報,我們可以添加多個Widget來關注多個城市的天氣情況,另外,點擊Widget後我們還可以看到今後幾天的詳細預報。
這讓我想起了HTC Source的Nick Gray上周的一篇文章Android Widgets, Unlimited Potential中提到的幾類可能會大受歡迎的Android桌面Widget。
Android本身已經自帶了時鍾、音樂播放器、相框和Google搜索4個Widget程序,不過這並不能阻止大家開發自己更加美觀,功能更豐富的版本。另外,微博客、RSS訂閱、股市信息、天氣預報這些Widget也都有流行的可能。
微博客Widget:Twidroid是Android上迄今為止最棒的Twitter客戶端,大家顯然都期待著它會推出支持桌面Widget的版本,另外像國內比較受歡迎的飯否、嘀咕、嘰歪等應該也會有類似的Widget推出。對於一個微博客類的Widget來說,有兩個方面是必不可少的,一是用來發布消息,另一個則是用來瀏覽。
RSS訂閱Widget: 盡管微博客(尤其是Twitter)已經完全蓋過來RSS訂閱的風頭,越來越多的人用Twitter來跟蹤站點的更新,不過RSS訂閱也並非完全沒有了市場,像分類訂閱這樣的功能還是需要RSS來幫忙,另外站點管理員也未必會在Twitter上發布所有的更新。
股市信息Widget:對於炒股的人來說,大概沒有什麼能比在手機桌面上放上幾個所關注股票的實時股價更有運籌帷幄的感覺了吧。
天氣預報Widget:對於我這樣成天窩在辦公室或者家裡的人來說,有一個Widget能夠讓我了解當前的天氣和近1、2天的天氣是非常有用的,這大概會大大減少我下了樓又跑回去拿雨傘的幾率。如果能加上像TouchFLO 3D中那樣的UI效果,當然就更酷了。
這只是我現在想到的一些Widget,得益於Android 1.5為我們提供的Widget API為我們的手機桌面帶來的無限的可能,我們的手機桌面無疑將會更有趣。
對國內G1的用戶,如果想體驗Android 1.5的桌面Widget,可以看看Haykuro的blog,他正在為製作G1可用的Android 1.5 ROM而努力。另外,T-Mobile已經計劃在五月向德國的T-Mobile G1用戶推送1.5的更新了,所以即使到時候沒有官方的G1簡體中文1.5 ROM,相信Haykuro的 1.5 ROM for G1也能非常接近官方的成熟度。
Widget應用目前在Android手機上得到了廣泛的應用。由於其方便小巧,所以得到了很多的應用,像天氣,微博,信息,歌曲,時間等等。
關於android Wpp widget:
應用程序窗口小部件(Widget)是微小的應用程序視圖,可以被嵌入到其它應用程序中(比如桌面)並接收周期性的更新。你可以通過一個App Widget provider來發布一個Widget。可以容納其它App Widget的應用程序組件被稱為App Widget宿主。下面的截屏顯示了一個音樂App Widget。