Android 는 동적 으로 Gallery 에 그림 과 그림자,3D 효과 예 시 를 추가 합 니 다.
Android 에서 gallery 는 그림 을 잘 표시 하 는 방식 을 제공 하여 위의 효과 와 데이터 베 이 스 를 동적 으로 추가 하거나 인터넷 에서 다운로드 한 그림 자원 을 실현 할 수 있 습 니 다.우 리 는 먼저 사용자 정의 Gallery 류 를 실현 합 니 다.
MyGallery.java:
package nate.android.Service;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Transformation;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;
publicclass MyGallery extends Gallery {
private Camera mCamera =new Camera();
privateint mMaxRotationAngle =45;
privateint mMaxZoom =-120;
privateint mCoveflowCenter;
public MyGallery(Context context) {
super(context);
this.setStaticTransformationsEnabled(true);
}
public MyGallery(Context context, AttributeSet attrs) {
super(context, attrs);
this.setStaticTransformationsEnabled(true);
}
public MyGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.setStaticTransformationsEnabled(true);
}
publicint getMaxRotationAngle() {
return mMaxRotationAngle;
}
publicvoid setMaxRotationAngle(int maxRotationAngle) {
mMaxRotationAngle = maxRotationAngle;
}
publicint getMaxZoom() {
return mMaxZoom;
}
publicvoid setMaxZoom(int maxZoom) {
mMaxZoom = maxZoom;
}
privateint getCenterOfCoverflow() {
return (getWidth() - getPaddingLeft() - getPaddingRight()) /2
+ getPaddingLeft();
}
privatestaticint getCenterOfView(View view) {
return view.getLeft() + view.getWidth() /2;
}
protectedboolean getChildStaticTransformation(View child, Transformation t) {
finalint childCenter = getCenterOfView(child);
finalint childWidth = child.getWidth();
int rotationAngle =0;
t.clear();
t.setTransformationType(Transformation.TYPE_MATRIX);
if (childCenter == mCoveflowCenter) {
transformImageBitmap((ImageView) child, t, 0);
} else {
rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);
if (Math.abs(rotationAngle) > mMaxRotationAngle) {
rotationAngle = (rotationAngle <0) ?-mMaxRotationAngle
: mMaxRotationAngle;
}
transformImageBitmap((ImageView) child, t, rotationAngle);
}
returntrue;
}
protectedvoid onSizeChanged(int w, int h, int oldw, int oldh) {
mCoveflowCenter = getCenterOfCoverflow();
super.onSizeChanged(w, h, oldw, oldh);
}
privatevoid transformImageBitmap(ImageView child, Transformation t,
int rotationAngle) {
mCamera.save();
final Matrix imageMatrix = t.getMatrix();
finalint imageHeight = child.getLayoutParams().height;
finalint imageWidth = child.getLayoutParams().width;
finalint rotation = Math.abs(rotationAngle);
// Z camera , 。
// Y , ;X 。
mCamera.translate(0.0f, 0.0f, 100.0f);
// As the angle of the view gets less, zoom in
if (rotation < mMaxRotationAngle) {
float zoomAmount = (float) (mMaxZoom + (rotation *1.5));
mCamera.translate(0.0f, 0.0f, zoomAmount);
}
// Y , 。
// X , 。
mCamera.rotateY(rotationAngle);
mCamera.getMatrix(imageMatrix);
imageMatrix.preTranslate(-(imageWidth /2), -(imageHeight /2));
imageMatrix.postTranslate((imageWidth /2), (imageHeight /2));
mCamera.restore();
}
}
레이아웃 파일 에서
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
>
<LinearLayout
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="vertical" android:paddingTop="10px"
>
<LinearLayout
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="@+id/dishName" android:textSize="18pt"
android:text=" "
/>
<LinearLayout
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal" android:paddingLeft="10px"
>
<TextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:id="@+id/ds" android:textSize="18pt"
android:text=" : "
/>
<RatingBar
android:numStars="5" android:rating="3"
android:stepSize="0.2" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:isIndicator="true"
android:id="@+id/dishScores" style="?android:attr/ratingBarStyleSmall"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:id="@+id/dishPrice" android:text=" " android:textSize="18pt"
/>
</LinearLayout>
</LinearLayout>
<nate.android.Service.MyGallery
android:id="@+id/Gallery01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
<TextView
android:text="
, "
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/gallery01"
android:paddingLeft="5px"
android:id="@+id/showHint"
/>
</LinearLayout>
위의 XML 파일 에서 사용자 정의 마 이 갤러리 를 사 용 했 습 니 다.그리고 이미지 Adapter 클래스 를 BaseAdapter 에서 계승 합 니 다.
package nate.android.Service;
import java.util.ArrayList;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
publicclass ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
private Context mContext;
private ArrayList<byte[]> dishImages =new ArrayList<byte[]>();
private ImageView[] mImages;
public ImageAdapter(Context c,ArrayList<byte[]> tmpDishImages) {
mContext = c;
dishImages = tmpDishImages;
mImages =new ImageView[dishImages.size()];
}
publicboolean createReflectedImages() {
finalint reflectionGap =4;
int index =0;
System.out.println("dishImages size "+ dishImages.size());
for (int i =0; i < dishImages.size(); ++i ) {
System.out.println("dishImage --- "+ dishImages.get(i));
Bitmap originalImage = BitmapFactory.decodeByteArray(dishImages.get(i), 0, dishImages.get(i).length);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
Matrix matrix =new Matrix();
matrix.preScale(1, -1);
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
height /2, width, height /2, matrix, false);
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height /2), Config.ARGB_8888);
Canvas canvas =new Canvas(bitmapWithReflection);
canvas.drawBitmap(originalImage, 0, 0, null);
Paint deafaultPaint =new Paint();
canvas.drawRect(0, height, width, height + reflectionGap,
deafaultPaint);
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
Paint paint =new Paint();
LinearGradient shader =new LinearGradient(0, originalImage
.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
paint.setShader(shader);
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
ImageView imageView =new ImageView(mContext);
imageView.setImageBitmap(bitmapWithReflection);
// imageView.setLayoutParams(new GalleryFlow.LayoutParams(180, 240));
imageView.setLayoutParams(new MyGallery.LayoutParams(270, 360));
//imageView.setScaleType(ScaleType.MATRIX);
mImages[index++] = imageView;
}
returntrue;
}
private Resources getResources() {
returnnull;
}
publicint getCount() {
return dishImages.size();
}
public Object getItem(int position) {
return position;
}
publiclong getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
return mImages[position];
}
publicfloat getScale(boolean focused, int offset) {
return Math.max(0, 1.0f/ (float) Math.pow(2, Math.abs(offset)));
}
}
이 클래스 에서 구조 함 수 는 갤러리 에 그 릴 그림 데 이 터 를 입력 해 야 합 니 다.Bitmap originalImage = BitmapFactory.decodeByteArray(dishImages.get(i), 0, dishImages.get(i).length);
이 글 에서 비교적 상세 한 설명 이 있다.byte[]형식의 그림 데 이 터 를 복원 합 니 다.byte[]형식의 이미지 원본 데 이 터 는 Array List
아래 activity 에 서 는 사용자 정의 baseAdapter 와 Gallery 를 사용 합 니 다.위의 그림 에 표 시 된 효 과 를 실현 하 다.
인 스 턴 스 클래스 사용
package com.nate.wte2;
import java.io.IOException;
import java.util.ArrayList;
import nate.InfoService.DishInfo;
import nate.InfoService.StoreInfoService;
import nate.InfoService.WhichChoice;
import nate.NetConnection.GetConnectionSock;
import nate.android.Service.GalleryFlow;
import nate.android.Service.ImageAdapter;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import com.nate.wte.LocalSql.StoresInfoDB;
publicclass DishMenuActivity extends Activity {
private ArrayList<DishInfo> dishInfoList =new ArrayList<DishInfo>();
private TextView dishName;
private RatingBar dishScores;
private TextView dishPrice;
//3:send the dish's whole info to fill the activity(send the comments of the dish)
privateint flag3 =3;
WhichChoice choice3 =new WhichChoice(flag3);
private StoreInfoService storeInfo;
private ProgressDialog loadingDialog;
/**
* handler handle the dialog dismission
*/
private Handler handler =new Handler(){
@Override
publicvoid handleMessage(Message msg) {
loadingDialog.dismiss();
//other operation
super.handleMessage(msg);
}
};
/**
* thread to load the data from local database or from the server
* @author Administrator
*
*/
class Loading implements Runnable{
@Override
publicvoid run() {
try {
// sleep , , dialog
Thread.sleep(1500);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* loading the items,start the thread to load
*/
publicvoid loadingItems(){
loadingDialog = ProgressDialog.show(DishMenuActivity.this, "", "loading...");
Thread t =new Thread(new Loading());
t.start();
}
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dishmenu_gallery);
StoresInfoDB infoDB;
int dishInfoListLength;
ArrayList<byte[]> dishImages =new ArrayList<byte[]>();
byte[] dishImage;
dishName = (TextView)this.findViewById(R.id.dishName);
dishPrice = (TextView)this.findViewById(R.id.dishPrice);
dishScores = (RatingBar)this.findViewById(R.id.dishScores);
// intent Choices
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("bundleData");
storeInfo = (StoreInfoService)bundle.getSerializable("storeInfo");
dishInfoList = (ArrayList<DishInfo>)bundle.getSerializable("dishInfoList");
System.out.println("look look the info received from Choices Activity");
for(int i =0; i < dishInfoList.size(); i++){
System.out.println("--- "+ i + dishInfoList.get(i).getDishImage().toString());
}
dishInfoListLength = dishInfoList.size();
// dishImages
for(int i =0; i < dishInfoListLength; i++){
dishImages.add(dishInfoList.get(i).getDishImage());
}
System.out.println("the length of the dishImages ---- "+ dishImages.size());
////////////////////////////////
//
////////////////////////////////
ImageAdapter adapter =new ImageAdapter(DishMenuActivity.this,dishImages);
adapter.createReflectedImages();
GalleryFlow galleryFlow = (GalleryFlow) findViewById(R.id.Gallery01);
galleryFlow.setOnItemSelectedListener(new OnItemSelectedListener(){
@Override
publicvoid onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
String showName =" : "+ dishInfoList.get((int)arg3).getDishName() +"";
dishName.setText(showName);
dishScores.setRating(dishInfoList.get((int)arg3).getDishScores());
dishPrice.setText(" : "+ dishInfoList.get((int)arg3).getPrice() +"
");
}
@Override
publicvoid onNothingSelected(AdapterView<?> arg0) {
}
});
galleryFlow.setOnItemClickListener(new OnItemClickListener(){
@Override
publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
loadingItems();
DishInfo dishInfo = dishInfoList.get((int)arg3);
try {
GetConnectionSock.fromClient.writeObject(choice3);
System.out.println("send the flag 3 ");
GetConnectionSock.fromClient.writeObject(dishInfo);
System.out.println("send the name back to server");
DishInfo dishComments = (DishInfo)GetConnectionSock.fromServer.readObject();
System.out.println("recv the dish comments");
dishInfo.setDishName(dishInfoList.get((int)arg3).getDishName());
dishInfo.setDishComments(dishComments.getDishComments());
System.out.println("full the dish info");
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Intent intent =new Intent();
Bundle bundle =new Bundle();
bundle.putSerializable("dishInfo",dishInfo);
bundle.putSerializable("storeInfo",storeInfo);
intent.putExtra("dishBundleData",bundle);
intent.setClass(DishMenuActivity.this,DishInfoDynamic.class);
Toast.makeText(DishMenuActivity.this, " ",Toast.LENGTH_LONG).show();
DishMenuActivity.this.startActivity(intent);
}
});
galleryFlow.setAdapter(adapter); //
}
}
이 activity 에서 본 논문 과 관련 된 것 은 바로 galley 에 이미지 기능 을 추가 하 는 것 입 니 다.위 코드 에 표 시 된 일부 코드 만 주의 하면 됩 니 다.데이터 출처 가 얻 는 방식 이 다 릅 니 다.여 기 는 데이터 가 Array List더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.