好久没来看博客了,今天进来,给大家带来我最近写得一个特效。当然目前提供的是简单得版本,只供大家学习研究用,如果大家也有好的东西欢迎分享!
居然发现插入截图不方便。。。无语!
新浪微博: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