好久没来看博客了,今天进来,给大家带来我最近写得一个特效。当然目前提供的是简单得版本,只供大家学习研究用,如果大家也有好的东西欢迎分享!
居然发现插入截图不方便。。。无语!
新浪微博:weibo.com/myzoooo
效果如下:
import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.File; import javax.swing.JFrame; import javax.swing.JPanel; public class WinMain extends JFrame { private static final long serialVersionUID = 1L; static final int DISPLAY_NUMBER = 7; static final int MARGIN = 50; int [][] positions = new int[DISPLAY_NUMBER][3]; int [] pox = new int[DISPLAY_NUMBER]; boolean stopThread = false; boolean start = false; Jpan jp = null; Image[] mImages = null; BufferedImage bufferImage = null; boolean isLeft = false; public WinMain() { mImages = getImages(); setSize(800, 500); setLocation(300, 0); setTitle("CoverFlow"); setDefaultCloseOperation(EXIT_ON_CLOSE); init(); jp=new Jpan(); jp.addMouseListener(mouseListener); jp.addMouseMotionListener(mouseMotionListener); add(jp); setVisible(true); } public void init() { int v = DISPLAY_NUMBER/2; for(int i = -v,j = 0;i<=v;i++,j++){ int x = i*MARGIN; positions[j][0] = x ; positions[j][1] = (int) getY(x); positions[j][2]=j; } sortY(); } public void sortY(){ for(int i=0;i<DISPLAY_NUMBER -1 ;i++){ for(int j=0;j<DISPLAY_NUMBER-i-1;j++){ int y = positions[j][1]; int y2 = positions[j+1][1]; if(y>y2){ int tx = positions[j][0]; int ty = positions[j][1]; int tidx = positions[j][2]; positions[j][0] = positions[j+1][0]; positions[j][1] = positions[j+1][1]; positions[j][2] = positions[j+1][2]; positions[j+1][0] = tx; positions[j+1][1] = ty; positions[j+1][2] = tidx; } } } } public void sortX(){ for(int i=0;i<DISPLAY_NUMBER -1 ;i++){ for(int j=0;j<DISPLAY_NUMBER-i-1;j++){ int x = positions[j][0]; int x2 = positions[j+1][0]; if(x<x2){ int tx = positions[j][0]; int ty = positions[j][1]; int tidx = positions[j][2]; positions[j][0] = positions[j+1][0]; positions[j][1] = positions[j+1][1]; positions[j][2] = positions[j+1][2]; positions[j+1][0] = tx; positions[j+1][1] = ty; positions[j+1][2] = tidx; } } } } public void left(){ int maxV = (DISPLAY_NUMBER/2)*MARGIN; if(pox[0]!=maxV){ isLeft = true; stopThread = false; new Animation().start(); } } public void right(){ int maxV = (DISPLAY_NUMBER/2)*MARGIN; if(pox[DISPLAY_NUMBER-1]!=maxV){ isLeft = false; stopThread = false; new Animation().start(); } } public void move(int x){ } public static void main(String[] args) { new WinMain(); } public void draw(Graphics g){ final int width = 120; final int height = 80; final int width2 = width/2; final int height2 = height/2; for(int i=0;i<DISPLAY_NUMBER;i++){ int x = positions[i][0]; int y = positions[i][1]; int idx = positions[i][2]; g.drawImage(mImages[idx], x+360 - width2, y+220 - height2,width,height,null); } } Object lock = new Object(); class Animation extends Thread{ final int start = -(DISPLAY_NUMBER/2) * MARGIN; final int end = DISPLAY_NUMBER/2 * MARGIN; public void run() { synchronized (lock) { for(int idx=0;idx<MARGIN && !stopThread;idx++){ // sortX(); for(int i=0;i<DISPLAY_NUMBER;i++){ int x = positions[i][0]; int imgIdx = positions[i][2]; if(isLeft){ if(x-1>=start){ int v = pox[imgIdx]; x--; if(v>0){ x++; pox[imgIdx]--; } }else{ // x = end; pox[imgIdx]++; } }else{ if(x+1>end){ // x = start; pox[imgIdx]++; }else{ int v= pox[imgIdx]; x++; if(v>0){ x--; pox[imgIdx]--; } } } positions[i][0] = x; positions[i][1] = (int) getY(x); // System.out.println("IDX:"+i +" X="+positions[i][0]+",Y="+positions[i][1]); } // System.out.println("===================="+idx+"======================="); sortY(); jp.updateUI(); try{ Thread.sleep(5); }catch(Exception e){ e.printStackTrace(); } } stopThread=true; System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<"); for(int i=0;i<pox.length;i++){ System.out.println(pox[i]); System.out.println("X:"+positions[i][0]+" Y:"+positions[i][1]); } System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>"); } }; } class Jpan extends JPanel { public void paint(Graphics g) { super.paint(g); drawBackground(g); draw(g); } } public void drawBackground(Graphics g){ if(bufferImage ==null){ bufferImage = new BufferedImage(800, 500, BufferedImage.TYPE_INT_ARGB); Graphics bg=bufferImage.getGraphics(); for(int i=0;i<bufferImage.getHeight();i++){ bg.setColor(new Color(0.0f, 0.0f, 0.0f, (float) (1.0f-i*0.002))); bg.drawLine(0, i, this.getWidth(), i); } } g.drawImage(bufferImage, 0, 0, null); } static Image [] getImages(){ String path = "E:\\images"; File[] fileList = new File(path).listFiles(); Image [] images = null; if(fileList !=null){ images = new Image[fileList.length]; } for(int i=0;fileList != null &&i<fileList.length ;i++){ images[i]=Toolkit.getDefaultToolkit().createImage(fileList[i].getPath()); } return images; } public float getY(float x){ float a; float b = 4; if(x<0){ a = 0.35f; }else{ a = -0.35f; } float y = a*x +b; return y; } MouseMotionListener mouseMotionListener = new MouseMotionListener() { @Override public void mouseMoved(MouseEvent e) { move(e.getX()); } @Override public void mouseDragged(MouseEvent e) { } }; MouseListener mouseListener = new MouseListener() { @Override public void mouseReleased(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { if(e.getX()> WinMain.this.getWidth()/2){ System.out.println("Right"); right(); }else{ System.out.println("Left"); left(); } } }; }
1.相对布局
相对布局由RelativeLayout代表,相对布局容器内子组件的位置总是相对兄弟组件、父容器来决定的,因此这种布局方式被称为相对布局。
如果A组件的位置是由B组件的位置来决定的,Android要求先定义B组件,再顶定义A组件。
RelativeLayout的XML属性及相关方法说明
XML属性 相关方法 说明 android:gravity setGravity(int) 设置该布局容器内部各子组件的对齐方式 android:ignoreGravity setIgnoreGravity(int) 设置哪个组件不受gravity组件的影响
RelativeLayout.LayoutParams里只能设为boolean值得属性
属性 说明 android:layout_centerHorizontal 控制该子组件是否位于布局容器的水平居中位置 android:layout_centerVertical 控制该子组件是否位于布局容器的垂直居中位置 android:layout_Inparent 控制该子组件是否位于布局容器的中央位置 android:layout_alignParentBottom 控制该子组件是否位于布局容器低端对齐 android:layout_alignParentLeft 控制该子组件是否位于布局容器左边对齐android:layout_alignParentRight
控制该子组件是否位于布局容器右边对齐 android:layout_alignParentTop 控制该子组件是否位于布局容器顶端对齐
RelativeLayout.LayoutParams里只能设为其他UI组件ID的属性
XML属性 说明 android:layout_toRightOf 控制该子组件位于给出ID组件的右侧 android:layout_toLeftOf 控制该子组件位于给出ID组件的左侧 android:layout_above 控制该子组件位于给出ID组件的上方 android:layout_below 控制该子组件位于给出ID组件的下方 android:layout_alignTop 控制该子组件位于给出ID组件的上边界对齐 android:layout_alignBottom 控制该子组件位于给出ID组件的下边界对齐 android:layout_alignLeft 控制该子组件位于给出ID组件的左边界对齐 android:layout_alignRight 控制该子组件位于给出ID组件的右边界对齐
展示梅花布局效果
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!--定义该组件位于父容器中间 --> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/rview01" android:layout_centerInParent="true" android:background="@drawable/leaf"> </TextView> <!-- 定义该组件位于rview01组件的上方 --> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/rview02" android:background="@drawable/leaf" android:layout_above="@+id/rview01" android:layout_alignLeft="@+id/rview01"> </TextView> <!-- 定义该组件位于rview01组件的下方 --> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/rview03" android:background="@drawable/leaf" android:layout_below="@+id/rview01" android:layout_alignLeft="@+id/rview01"> </TextView> <!-- 定义该组件位于rview01组件的左边 --> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/rview04" android:background="@drawable/leaf" android:layout_toLeftOf="@+id/rview01" android:layout_alignTop="@+id/rview01" > </TextView> <!-- 定义该组件位于rview01组件的右边 --> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/rview05" android:background="@drawable/leaf" android:layout_toRightOf="@+id/rview01" android:layout_alignTop="@+id/rview01"> </TextView> </RelativeLayout>
效果图:
2.绝对布局
绝对布局由AbsoluteLayout代表,Android不提供如何布局控制,而是由开发人员自己通过X坐标,Y坐标来控制组件的位置。
XML属性说明
XML属性 说明 android:layout_x 指定该子组件的X坐标 android:layout_y 指定该子组件的Y坐标
Android中一般支持以下常用的距离单位
px(像素):每个px对应屏幕上的一个点。
dip或dp(device independent pixels,设备独立像素):一种及与屏幕密度的抽象单位。 在每英寸160点的显示器上,1dip=1px,但随着屏幕密度的改变,dip与px的换算会发生改变。
sp(scaled pixels,比例像素):主要处理字体的大小,可以根据用户的字体大小首选项进行缩放
in(英寸):标准长度单位
mm(毫米):标准长度单位
pt(磅):标准长度单位,1/72英寸
登录界面
<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <!-- 定义一个文本框,使用绝对定位 --> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_x="20dip" android:layout_y="20dip" android:text="用户名:"> </TextView> <EditText android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_x="80dip" android:layout_y="15dip" android:width="200px"> </EditText> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_x="20dip" android:layout_y="80dip" android:text="密码:"> </TextView> <EditText android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_x="80dip" android:layout_y="75dip" android:password="true" android:width="200px"> </EditText> <Button android:layout_x="130dip" android:layout_y="135dip" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="登录"/> </AbsoluteLayout>
效果图
本人开了个充值淘宝网店。有需要的朋友请访问的店铺并拍下所充值的话费,
本店已加入消费保障服务计划,货源来源于淘宝充值平台,安全可靠便捷,
支付过后立即到账
http://xiaowen168.taobao.com
在 excel 2007下测试过
代码作用域:thisworkbook
Private Sub Workbook_Open() Sheets(1).Protect Password:="***", userInterFaceonly:=True Sheets(1).EnableOutlining = True End Sub